Версия для печати темы (https://pro1c.org.ua/index.php?s=567d81125dba599925dc70e00da59d2b&showtopic=41110)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Оптимизация скорости выполнения запроса
Автор: Sympho 18.10.17, 10:54
Подскажите, пожалуйста, возможно-ли как-то оптимизировать запрос по выборке документов с определенными значениями реквизитов?
Пример:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка
ИЗ
Документ.ЛюбойДокумент КАК Документ
ГДЕ
Документ.Реквизит = &НеобходимоеЗначениеРеквизита
И НЕ Документ.Ссылка В (&ЛюбойОтборСпискаДокументов)
Т.е. тут отбираются все документы и только потом на таблицу накладывается отбор (документов туча). Как можно оптимизировать по скорости?
Автор: sava1 18.10.17, 11:26
1. Индексировать по реквизиту.
2. Уйти от конструкции НЕ в .....
Автор: Sympho 18.10.17, 11:33
Изменил запрос на:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДоки
ИЗ
Документ.ЛюбойДокумент КАК Документ
ГДЕ
Документ.Ссылка = &НеобходимоеЗначениеРеквизита
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДоки.Ссылка
ИЗ
ВТДоки КАК ВТДоки
ГДЕ
НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)
Стало выполняться больше чем на порядок быстрей. Не знаю, правда, насколько это правильно...
Автор: Vofka 18.10.17, 11:56
Цитата(Sympho @ 18.10.17, 12:33)
Изменил запрос
По-моему, какая-то ерунда получилась, которая по своему смыслу ещё и отличается от первоначального запроса.
Автор: Sympho 18.10.17, 12:06
Это я уже понял что хрень какая-то вышла, надо подышать)
Автор: Sympho 18.10.17, 13:43
Там в условии Документ.Реквизит, опечатался. Но, в итоге все равно по скорости отрабатывает одинаково.
Итого, насколько я понял, альтернативы нет.
Автор: sava1 18.10.17, 14:16
Цитата(Sympho @ 18.10.17, 14:43)
альтернативы нет.
Чему ?
В таком варианте время выборки зависит от размера списка ЛюбойОтборСпискаДокументов
Цитата(Sympho @ 18.10.17, 12:33)
ГДЕ НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)
Выбирете все документы из списка во временную таблицу
Потом соедините с основной выборкой по NULL
Автор: Sympho 18.10.17, 15:40
sava1 @ Сегодня, 14:16
,
Спасибо, попробую.
А если нет списка? Т.е. просто:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка
ИЗ
Документ.ЛюбойДокумент КАК Документ
ГДЕ
Документ.Реквизит = &СсылкаНаДругойДокумент
Такое не ускоряется? Просто в базе десятки тысяч документов.
Автор: Flexy 18.10.17, 21:55
Цитата(Sympho @ 18.10.17, 11:33)
Изменил запрос на:
Имхо, не верная логика. Для начала нужно ограничить список документов (первый пакет запроса - виртуальная таблица + индекс по нужному полю). Вторым пакетом - отбор с условием по нужному значению поля.
Автор: andr_andrey 20.10.17, 17:44
sava1 @ 18.10.17, 15:16
,
Цитата(sava1 @ 18.10.17, 15:16)
В таком варианте время выборки зависит от размера списка ЛюбойОтборСпискаДокументов
Цитата(Sympho @ 18.10.17, 12:33) *
ГДЕ НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)
Выбирете все документы из списка во временную таблицу
Потом соедините с основной выборкой по NULL
Насколько помню, SQL server даёт одинаковые планы выражению "В" и соединению с отбором по NULL. (в прошлом это меня приятно удивило по сравнению с mysql, который так делать не умел, и в рекомендациях была такая оптимизация).
Автор: sava1 20.10.17, 18:18
Цитата(andr_andrey @ 20.10.17, 18:44)
одинаковые планы выражению "В" и соединению с отбором по NULL
Да, но не по "НЕ В"
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua