v7: После перевода базы на SQL время выполнения запроса возросло в 50 раз! #666584


#0 by Калиостро
Справочник номенклатуры содержит около 25000 элементов. Количество уровней - 6. Есть реквизит "Код сортировки", строка, длина 3. Используется для групп и элементов. Фактически заполняется только для групп с целью отсортировать для вывода прайс-листа и каталога. СписокНоменклатуры - заполняется элементами с учетом нескольких фильтров и содержит около 5000 элементов И дальше запрос. ТекстЗапроса = " На базе DBF выполнялся 20 сек. Теперь, после перевода на SQL, время выполнения запроса около 18 мин!
#1 by Калиостро
Если делаю прямой запрос    |select    |    СпрНоменклатура.ID [Номенклатура $Справочник.Номенклатура] То на выходе необходимый список элементов со всеми группами. Но как вытащить ту же структуру групп с сортировкой по полю "КодСортировки", что получается в результате черного запроса?
#2 by Злопчинский
"КодСортировки" - стоит флажок сортировка" в пофигуртаоре?
#3 by Калиостро
Нет.
#4 by Злопчинский
а попробовать поставить?
#5 by Злопчинский
и не нравится мне |Условие (Номенклатура в СписокНоменклатуры); с учетом 25000 раз проверить вхождение в список из 5000 элементов...
#6 by Злопчинский
для начала тупо закомментируй это условие и проверь.
#7 by Калиостро
, спасибо, завтра буду экспериментировать, отпишусь.
#8 by Холст
а оно не кешируется разве ?
#9 by Злопчинский
хз, я не спец. но мну такое не нравится...
#10 by Холст
а чем ты заменяешь подобное условие ?
#11 by Злопчинский
ничем, ятакой хренью не занимаюсь, у меня номенклатуры на порядок меньше.. ;-) . если это разовый отчет - то и пофиг. если это регулярный отчет - то в эти 5000 прописать флажок=1 в индексируемое поле и отбирать по этому полю. . но я по запросам и их тонкой трактовке - не спец. лучше спецов дождаться.
#12 by viktor_vv
Можно еще попробовать для штатного черного Запрос.ВключитьSQL ; Запрос.Выполнить(ТекстЗапроса);
#13 by Balabass
+1
#14 by второй Вах
ни разу не встречал чтоб под скуль сервером быстее чем на дбф работало
#15 by второй Вах
+ в таких мелких базах, разумеется
#16 by МихаилМ
в 1с77 sql чтобы это запрос работал быстрее, нужно отказаться от сортировки. тк для каждого элемента выборки после получения выборки будет сгенерирован запрос 5000 элементов = + 5000 запросов. поэтому лучше сортировать тз после выборки и выгрузки также очень медленно реализована передача списка отбора оператора В : для каждого элемента создается временная хранимая процедура, выполняется затем уничтожается. конструкцию в лучше заменть  Условие (Номенклатура = пар[1] ИЛИ ... Номенклатура = пар[N]. есть ограничение на размер текста запроса odbc клиента так что в одном запросе можно указать не более 2200 9 символьных ключей.
#17 by пипец
в скуле упорядочивать по текстовому полю типа наименование - да еще вторым номером ...
#18 by Sorm
"@Условие (Номенклатура в СписокНоменклатуры)" убрать. По возможности заменить джоином с временной таблицей(плохо знаю запросы 1с 7.7). Отребилдить индексы на таблице номенклатуры.
#19 by МихаилМ
почему в запросе  нет подсказок "nolock" лучше элементы выбирать отдельно , группы отдельно (есть индекс для групп)
#20 by 7Hawk7
ВыбратьЭлементы в 7 для справочников работает быстрее запроса, попробуй выборку.
#21 by Калиостро
Отчет не разовый, запускается как минимум 1 раз в день по регламенту или по требованию. Флаг сортировки у реквизита "КодСортировки" поставил. Результат практически нулевой. nolock в запросе поставлю. Запрос в запускался в тестовой базе. ОК, буду пробовать.
#22 by viktor_vv
Надо ВключитьSQL .
#23 by viktor_vv
+ Не факт что поможет, но бывает.
#24 by МихаилМ
выбрать элементы быстрее работает для dbf варианта для sql выборка из запросов быстрее
#25 by 7Hawk7
проводил замеры? я да, и результат указал в
#26 by МихаилМ
конечно мерил. в 2003 году. естественно файловая база и ms sql были доступны через сеть 100 mb локальные замеры - бессмысленны.
#27 by dk
проверял несколько раз на разных базах скуль если в списке значений для фильтра больше 100 элементов, то быстрее на клиенте отфильтровать, через
#28 by ЧеловекДуши
Это нормальное явление, 1С не оптимизирует запросы к SQL, поэтому и тормоза. Начни осваивать 1С++ и прямые запросы :)
#29 by ЧеловекДуши
Бред, нет нечего лучше, чем наш Select From $Справочник.Такой-то :)
#30 by ДенисЧ
Есть... TRUNCATE TABLE $Справочник.Такойто...
#31 by ЧеловекДуши
>>>    |LEFT JOIN    |    $Справочник.Номенклатура РОД1 ON СпрНоменклатура.parentID = РОД1.ID Убери эту гадость :)
#32 by ЧеловекДуши
Злодей ;)
#33 by Злопчинский
ну так что?
#34 by sapphire
Я тебя заразил? :)
#35 by sapphire
Версия SQL?
#36 by Калиостро
2000
#37 by Калиостро
Без фильтров и без сортировки по наименованию отрабатыаает на локальной машине за 7 сек, на сервере - 15 сек.
#38 by dk
добавь "без итогов"
#39 by dk
+ сделай по 2-3 запуска и посмотри как меняется / не меняется время
#40 by Эмбеддер
а если вместо СпрНоменклатура.ID [Номенклатура $Справочник.Номенклатура] сделать просто СпрНоменклатура.ID ?
#41 by Калиостро
+ К запросу добавляю СписокНоменклатуры содержит 12000 элементов. На ноутбуке (тоже SQL 2000) запрос выполняется 10 минут. На сервере не проверял. Все равно долго.
#42 by Калиостро
У меня не получается прямым запросом вытащить иерархию групп для СписокНоменклатуры, упорядоченную по КодСортировки. Если есть образец, буду премного благодарен. Поэтому сейчас пытаюсь выйти на приемлемое время с помощью черного запроса. Пусть не 20 сек, как в DBF, но и не 10 минут же!
#43 by Злопчинский
мне принципиально кажется что необходимость регулярно проверять условие по вхождение в немелкий список - что-то в концепции попраить надо...?
#44 by Serginio1
Посмотри там есть обработка вывода иерархии добавил обработки по группировке данных и выводе с учетом иерархии и суммам по группам иерархи из ТаблицыЗначений
#45 by Эмбеддер
и все-таки еще раз - тормоза могут быть уже при чтении результата запроса. попробуй убрать [..$Справочник], считай просто строки
#46 by dk
попробуй вариант
#47 by Эстет хренов
дурная работа, уже давно бы сделал справочник Прайс-лист в котором бы настраивал всю специфику каталогов и прайс-листов. Там можно создать различную иерархию, множественную вложенность товаров, свою сортировку, свое представление и оформление итд итп.
#48 by Калиостро
И как там получить отсортированный иерархический список групп по списку номенклатуры?
#49 by Калиостро
Дурная - не дурная, лучше не давать оценок, пока видишь только вершину айсберга проблем. База dbf работала с 2005 года. Чтобы после перевода на SQL запрос по номенклатуре выполнялся в 50 раз медленнее - этого, конечно, не ожидал.
#50 by Злопчинский
ну и фигли - это не значит, что все хорошо. как правило - смотришь на все это и думаешь, блин, ну что за уродство... . не.. когда из 25000 надо отфильтровать по вхождению в 12000 список - это не 5-6 позиций подбираемых руками - это уже какая-то система. а система - это флажки, реквизиты, но ну никак не список на 5000/12000 позиций, однозначно в консерватории...
#51 by Калиостро
Немного не в тему топика, но раз уж зашел разговор. В номенклатуре есть признак "Включать в прайс" и варианты: 1. Всегда (например, позиции собственного производства). 2. Никогда (специфические позиции раньше торговали массово, а теперь распродажа остатков с прилавка). 3. При остатке больше заданного количества (например, когда через интернет-магазин продавать меньше упаковки невыгодно). Формировать список, по-моему, здесь можно только в момент выгрузки, анализировать и перезаписывать флажки при проведении документов - еще хуже.
#52 by Mikeware
ну и у меня работает с 2005. иногда смотришь и думаешь - убил бы того, кто такое написал... а поразмыслишь - ну разве ж это повожд для самоубийства? :-)
#53 by Калиостро
+ Я и не говорю, что там все идеально. Система дописывалась годами. Где-то были глобальные переделки, где-то костыли. Сейчас тоже надо поставить костыль. Передохнем, а дальше подумаем.
#54 by Калиостро
+ 100. Если бы каждый раз при возникновении новой задачи надо было переделывать архитектуру с нуля, так и занимались бы описанием, согласованием ТЗ, тестированием, отладкой 90% времени. Лучше сейчас решить задачу на тройку. Если критических глюков не будет, когда-нибудь в свободное время  займемся рефакторингом.
#55 by aka AMIGO
переходи на прямые © запросы :) у меня примерно такая-же ситуация была, когда надежды шефа на ускорение разрушились: отчет в скуле стал работать в 3 раза медленнее.. всего в 3! а у тебя 50 :)
#56 by Калиостро
Дайте рыбу списать:( Надо получить иерархию групп для СписокНоменклатуры, упорядоченную по КодСортировки. Как в черном запросе "
#57 by Sorm
|LEFT JOIN        |(Select Val from FROM #СписокНоменклатуры order by Val) Список Я не знаю, так можно делать в прямых запросах 7.7.... Но скорость запроса возрастет.
#58 by Сияющий Асинхраль
А еще быстрее, как ни странно, заменить Условие (СписокНоменклатуры.Принадлежит(Номенклатура)=1) На: Условие (СписокНоменклатуры.НайтиЗначение(Номенклатура)<>0) Причем, что забавно НайтиЗначение частенько работает быстрее чем Принадлежит буквально в разы...
#59 by Mikeware
потому, что Найти - ищет в списке, а принадлежит - в иерархии. а поиск в иерархии - это запрос к базе
#60 by Mikeware
+ и он может отличаться не в разы, а на порядок
#61 by Mikeware
все-таки, я не понял что тебе нужно _в_результате_
#62 by Сияющий Асинхраль
Согласен... Давно на эту бадягу напоролся, уже несколько лет семеркой занимаюсь от случая к случаю, но разница на опыте оказалась такая существенная, что до сих пор помню, что Принадлежит лучше не использовать :-)))
#63 by Калиостро
Нужен список групп в определенной последовательности. Внутри одной группы порядок по полю "КодСортировки". Нужны не все группы, а только те, в которые входят элементы из списка. Вроде бы в запросе это просматривается.
#64 by Эмбеддер
вообще-то это делается так LEFT JOIN автор, тебя здесь все уговаривают сделай так, сделай так. а ты придумываешь всякие отмазки почему не надо это делать
#65 by Эмбеддер
64+ потому что в принципе на SQL такие прямые запросы в принципе не могут долго выполняться
#66 by Эмбеддер
вместо LEFT JOIN просто JOIN - так скопировал
#67 by Bugmenot
- и после этого вы еще считаете, что архитектура 1С - это Порше?
#68 by Mikeware
выбери всех прямых родителей элементов списка в индексированную таблицу, и сгруппируй по иерархии.
#69 by Bugmenot
- это разрыв шаблона, обычно при переходе на SQL все должно убыстряться, т.к. по сети гуляют не таблицы, а запросы.
#70 by Sorm
+ Буду знать. Ну я его код скопировал.... Идея понятна, конечно - уйти от where.
#71 by Classic
СКЛ в принципе зло
#72 by ДенисЧ
Не в этой жизни. То есть не в 1с
#73 by Bugmenot
- дело не в SQL, а в том, что фирма 1Це не оптимизиорвала свою т.н. SQL версию для SQL
#74 by Эмбеддер
все меньше остается 1Сников, которые видели 7-ку, а сама она переходит в разряд мифов кроме того как автор выводит группировку, будет странный результат - не учитывается, что элементы будут на разных уровнях
#75 by Калиостро
Нужны не только прямые родители, а вся иерархия от 1 уровня.
#76 by Mikeware
ты читать умеешь?
#77 by Mikeware
а "восьмерка разжижает мозг"©
#78 by ДенисЧ
не всем, не всем....
#79 by Калиостро
Запрос в дает все нужные группы. Попробую покрутить ИТ.
#80 by Serginio1
Сделай дерево наподобие в 44 и будет тебе счастье. Или Сделай на индексированной таблице с отбором по родителю
#81 by Калиостро
Error: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'ID'.
#82 by ДенисЧ
Список.ID а документацию кто читать будет?
#83 by viktor_vv
#СписокНоменклатуры Список on Список.VAL = СпрНоменклатура.ID
#84 by Калиостро
Пойдем путем банана... Выдает список номенклатуры из СписокНоменклатуры. Групп нет. Печаль.
#85 by Mikeware
сочувствую. parentId, а затем
#86 by Mikeware
кстати, distinct еще...
#87 by Ёпрст
скуль какой хоть ?
#88 by Ёпрст
вот, один из способов показа всей иерархии (но, для скуля>=2005)
#89 by NS
Есть очень быстрый способ штатного получения всех групп... Отсортировать можно уже в ТЗ.
#90 by NS
А понял, тебе не группы нужно.
#91 by Калиостро
Элементы у меня уже есть. Мне нужны как раз группы. Но не все и в определенном порядке.
#92 by Калиостро
2000
#93 by NS
А что, отсортировать их после получения нельзя? Или у тебя их миллион?
#94 by Serginio1
Ему нужна иерархия. Ему уже указали как решить проблему Через индексированную таблицу с рекурсивным отбором по родителю, либо через построение дерева 44.
#95 by fisher
А без упорядочивания сабжевый запрос сколько выполняется?
#96 by Serginio1
То что Ёпрст предложил в 88 Получаешь таблицу А дальше рекурсивно Установить Индекс КонецПроцедуры
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С