|
Оптимизация запроса с "ГДЕ" | ☑ | ||
---|---|---|---|---|
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
|
Всем большое спасибо за обсуждение и ссылки.
Ветку можно закрывать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |