Версия для печати темы (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