Имя: Пароль:
1C
1С v8
Порядок условий в запросе
0 DrLivsey
 
16.11.11
16:57
Запрос по документам, условия по нескольким полям и по Проведен.

Имеет ли смысл поиграться порядком условий в запросе для оптимизации оного? Или парсер запроса сам всё отработает?
1 Лефмихалыч
 
16.11.11
17:02
(0) условия вычисляются в том порядке, в котором они написаны. Имеет смысл
2 Maxus43
 
16.11.11
17:03
вперёд по Проведён, потом остальное
3 acsent
 
16.11.11
17:03
Еще важно чтобы они в одну строку были, выигрыш 5%
4 Ахиллес
 
16.11.11
17:03
(2) Обоснуй.
5 acsent
 
16.11.11
17:06
запрос с фильтром только по дате работает быстрее чем с фильтром по дате и проведен
6 Maxus43
 
16.11.11
17:08
чтоб у непрведенных реквизиты не проверять сразу.
Что логичней и быстрей? "Проверяем реквизиты и если проведён то норм" или "если проведён то проверяем реквизиты". я правда ХЗ такая логика в языке запросов работает или нет.
7 Ахиллес
 
16.11.11
17:11
На самом деле большинство документов в базе проведённые, поэтому условие по "Проведён" можно смело ставить на последнее место.
(6) В базе 1000 документов, 500 по 1 организации и 500 по второй . 999 проведено и 1 не проведён. Да мне пофигу отберёт запрос сначала 999 документов или 1000. А вот если первым я поставлю условие по "Организации", тогда второе условие будет проверятся уже только у половины документов.
8 DrLivsey
 
16.11.11
17:13
(2) классики говорят ставить первым то условие, которое вернет минимум документов, поэтому условие на Проведен последним хочется.
9 andrewks
 
16.11.11
17:13
тут на статистику документооборота смотреть надо.
и ставить в начало те условия, которые будут отсеивать максимальное количество строк
10 Maxus43
 
16.11.11
17:13
(7) от реквизитов зависит и от проведённх. если там 999 непроведено? а вобще - не то место это где за производительность надо бороться имхо
11 Maxus43
 
16.11.11
17:14
(8) согласен
12 Ахиллес
 
16.11.11
17:15
(11) Ну дык, я те то же самое написал.
13 Лефмихалыч
 
16.11.11
17:16
(5) это вранье. Только что проверил
14 Ненавижу 1С
 
гуру
16.11.11
17:16
(1) пруфссылку
15 Maxus43
 
16.11.11
17:17
(12) ну дык, вечер уже:)
16 Fragster
 
гуру
16.11.11
17:17
(14)+100500, причем на разных СУБД ;)
17 Maxus43
 
16.11.11
17:18
(13) тогда смысла в сабже нет, если 2 условия выполняются столько-же времени что и одно
18 Лефмихалыч
 
16.11.11
17:19
(14), (16) зануды
19 Maxus43
 
16.11.11
17:19
в СП написано как условия во встроенном языке работают. в нём да, имеет значение точно, часть условий может просто не проверяться. что касается запросов то это к СУБД надо
20 acsent
 
16.11.11
17:19
(13) Криво проверял значит. По дате есть индекс, а по полю проведен нет
21 Лефмихалыч
 
16.11.11
17:20
(17) два условия выполняются быстрее, чем одно
22 acsent
 
16.11.11
17:20
(19) Где написано????
23 Лефмихалыч
 
16.11.11
17:20
(20) нормально проверял - с разными значениями Проведен. И так, и эдак быстрее работает два условия
24 acsent
 
16.11.11
17:22
(23) На файловой наверно проверял
25 Лефмихалыч
 
16.11.11
17:27
(24) да вообще-то на серверной, у которой файл данных весит 2.7Тб
26 Лефмихалыч
 
16.11.11
17:28
(24) может это просто ты чо-то не то делал, когда получил обратные результаты?
27 Maxus43
 
16.11.11
17:28
(22) да, в СП нет, видимо в книжке какой-то читал)
28 acsent
 
16.11.11
17:31
(26) Если выборка одинаковая получается, а диапазон отбора маленький (чтоб впо инденксу искалось, а не сканом таблицы) то никак не может 2 операци выполняться быстрее одной
29 Лефмихалыч
 
16.11.11
17:32
(28) две выполняются не всегда, потому, что в запросе сокращенное вычисление условий. Именно по этому верно утверждение (1)
30 DrLivsey
 
16.11.11
17:34
База серверная, MSSQL, будут проверки по полям "Организация" и "ДокументОсенование". Потом будут вычисления по табличным частям.

Общая задача - нужен хитрый анализ основания и уже созданных подчиненных документов при создании новых подчиненных документов. Поэтому сначала отбираю нужные подчиненные документы, а потом в том же пакете запросов вычисляю их табличные части.

P.S. (19), что есть СП?
31 acsent
 
16.11.11
17:35
(29) Ты представляешь как сиквел вычисляет условия???
32 acsent
 
16.11.11
17:36
(29) А хоть раз план завпроса выводил?
33 rs_trade
 
16.11.11
17:36
(0) не имеет смысла. порядок вычисления выбирает оптимизатор
34 Ахиллес
 
16.11.11
17:37
Ну вот... пришёл лесник и всех разогнал :-)
35 Ахиллес
 
16.11.11
17:41
(33) А чего же тогда этот твой чудо оптимизатор не может с порядком условий в виртуальных таблицах справится?
З.Ы. Я лично в своей базе ускорил проведение документа в 30-60 раз, просто поменяв в регистре накопления порядок измерений (просто мне лень было лазить по всей конфе и менять запросы которые авнокодеры одинэсовские наваяли).
36 rs_trade
 
16.11.11
17:42
пруф

http://technet.microsoft.com/ru-ru/library/ms173545.aspx

в самом низу, Замечания
37 Ахиллес
 
16.11.11
17:43
(35) на (35) ответь.
38 Лефмихалыч
 
16.11.11
17:43
(33) так оптимизатор-то тоже не дурак. Более того, он местами умнее некоторых адинэсников

(31) выводил, только не ради условий. У меня доступа нет в сиквелу, прямо сейчас посмотреть не могу, но вот такой запрос:

"ВЫБРАТЬ
   ЗаказПоставщику.Ссылка КАК Ссылка,
   ЗаказПоставщику.Представление КАК СсылкаПредставление,
   ЗаказПоставщику.Дата КАК Дата1
ИЗ
   Документ.ЗаказПоставщику КАК ЗаказПоставщику
ГДЕ
   ЗаказПоставщику.Дата = &П
   И ЗаказПоставщику.Проведен = &П2"                                                            

выполняется не дольше, чем такой же, но без второго условия.
Непроведенных документов существенно больше проведенных в этой базе, по этому запрос с параметром П2=ложь отрабатывает иногда так же, как запрос вообще без этого условия, но чаще на 0.012сек быстрее (в базе 400+ пользюков, видать блокировки мешают). Вариант с П2=истина в три раза быстрее отрабатывает, чем без второго условия.
39 rs_trade
 
16.11.11
17:43
(35) а это здесь совсем не причем. в твоем случае я так понимаю индексы причем
40 Ахиллес
 
16.11.11
17:45
(39) Как это не при чем? Есть запрос к виртуальной таблице регистра. В нём несколько условий. Меняем местами порядок условий, запрос отрабатывает в десять раз быстрее. Как так? (Я не стал менять запросы, а поменял порядок измерений в регистре, результат тот же).
41 rs_trade
 
16.11.11
17:48
(40) берешь планы обоих запросов и смотришь. будет видно почему так. в общем случае скуль не гарантирует порядок вычисления условий.
42 Fragster
 
гуру
16.11.11
17:50
(40) порядок измерений <> порядок условий в запросе, и таки да, действительно влияет на скорость, если по измерениям установлены индексы
43 Ахиллес
 
16.11.11
17:50
(1) Кстати, если отбор по "Проведён = ИСТИНА", то не лучше ли запрос к регистру какому нибудь сделать?
44 szhukov
 
16.11.11
17:50
(0) Сделай себе правильных индексов и пользуй их - будет максимальная скорость :)
Оптимизатор подстроится под индекс если такой найдется.
Первый вызов может быть не быстрым (строится план и проводится оптимизация, данные кэшируются) зато последующие могут дать прирост в скорости :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший