Имя: Пароль:
1C
1С v8
Оптимизация запроса с "ГДЕ"
0 Owner2005
 
09.07.23
21:14
Доброго вечера всем, товарищи программисты!
Зело вынес мне все равновесие такой запрос:

ВЫБРАТЬ
    Реализация.Ссылка
        ИЗ
         Документ.Реализация КАК Реализация
         ГДЕ
            ГОД(Реализация.Дата) >= &Год
Запрос.УстановитьПараметр("Год", 2000);

Как видно сложного тут ничего нет, но коллега утверждает что его нужно оптимизировать. Знаю про "Или" и тому подобное, но тут совершенно нет ничего...
Если сравнивать просто дату, итоговый план запроса не изменится. Единственное, что увидел, это использование > вместо >=, со смещением даты на 1 сек. раньше, но назвать это оптимизацией язык не поворачивается. Очень было бы здорово услышать коллег, хотя догадываюсь, что тут можно услышать...
1 Волшебник
 
09.07.23
21:16
Где Реализация.Дата >= датавремя(2000,1,1,0,0,0)
2 Owner2005
 
09.07.23
21:36
(1) Спасибо, но датавремя по сути ничего не меняет.

Сделал базу вот план запроса.
Никаких торомозов тут быть не может, Index Seek есть...

Nested Loops(Inner Join, OUTER REFERENCES:([Expr1003], [Expr1004], [Expr1002]))
Compute Scalar(DEFINE:(([Expr1003],[Expr1004],[Expr1002])=GetRangeWithMismatchedTypes([@P1],NULL,(22))))
Constant Scan
Index Seek(OBJECT:(Документ.МаршрутныйЛист.[_Document21_2] AS [T1]), SEEK:([T1].[Дата] > [Expr1003] AND [T1].[Дата] < [Expr1004]) ORDERED FORWARD)
3 Жан Пердежон
 
09.07.23
21:36
на таблице документов всегда есть индекс по дате...
когда ты сравниваешь по дате - он может использоваться, как только ты с датой что-то делаешь в запросе - индекс идет нафиг...
план запроса не изменится, если у тебя в базе 3,5 документа;
4 Жан Пердежон
 
09.07.23
21:37
(2) план запроса явно не от запроса в (0)
5 Owner2005
 
09.07.23
21:39
(4) Да, вместо "реализация" "МаршрутныйЛист" единственное различие.
6 Owner2005
 
09.07.23
21:43
(3) Создал порядка 15000 документов. План запроса такой же.
Любые функции работы с датой вроде ДатаВремя или ГОД на плане запросов никак не сказывются.
7 Owner2005
 
09.07.23
21:44
Тут не нравится GetRangeWithMismatchedTypes.
8 Жан Пердежон
 
09.07.23
21:44
самый правильный вариант: Дата > &ПараметрДата
9 Owner2005
 
09.07.23
21:45
Согласен, самое простое и очевидное.
10 Волшебник
 
10.07.23
09:17
Надо смотреть не планы запроса, а замерять время выполнения
11 polosov
 
10.07.23
11:01
(10) Ваши сведения не соответствуют действительности.
12 unenu
 
10.07.23
11:28
Может соединением будет быстрее:

ВЫБРАТЬ датавремя(2000,1,1,0,0,0) КАК ГодОтбора
Поместить ВтГодОтбора
;
ВЫБРАТЬ
    Реализация.Ссылка
        ИЗ
         Документ.Реализация КАК Реализация
         Внутренее соединение  ВтГодОтбора КАК ВтГодОтбора
По
         Реализация.Дата >= ВтГодОтбора.ГодОтбора
13 JanK
 
10.07.23
12:37
(1) Язык запросов 8ки пытается оптимизировать такие сравнения сам, в этом случае должен был справиться.

(5) В плане явно есть join, откуда он могут взяться в запросе (0) как-то не видно (я, конечно, слепой - но пока уверен что там всего одна таблица).
14 Смотрящий
 
10.07.23
12:45
(0) Шариться надо по всем документам за период - не проведенный и помеченным на удаление ?
15 Жан Пердежон
 
10.07.23
13:15
(15) это GetRangeWithMismatchedTypes() из параметра &Год создает таблицу c двумя датами, с которой и соединяет, чтобы использовать Index Seek...
16 JanK
 
10.07.23
14:19
(16) Спасибо, интересно.
Но откуда в запросе (0) GetRangeWithMismatchedTypes?
17 alexey123perm
 
10.07.23
16:35
(0)
Посмотрите этот курс. Там как раз рассматривается ситуация про условия в функциях работы с датами
https://xn----1-bedvffifm4g.xn--p1ai/free/queries-optimization-mini-course/

Нужно изменить, Как в (1)
18 Конструктор1С
 
10.07.23
19:13
(6) ошибаешься, ещё как сказываются
19 mistеr
 
11.07.23
08:34
(2) Неужели платформа научилась переписывать Год()?
Респект, если так.
20 Simod
 
11.07.23
09:39
(0) Автор, см. https://its.1c.ru/db/v8std#content:658:hdoc
Твой случай там явно разобран.
21 Owner2005
 
25.07.23
12:23
Всем большое спасибо за обсуждение и ссылки.
Ветку можно закрывать.