Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация скорости выполнения запроса
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Sympho
Подскажите, пожалуйста, возможно-ли как-то оптимизировать запрос по выборке документов с определенными значениями реквизитов?

Пример:

ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка
ИЗ
    Документ.ЛюбойДокумент КАК Документ
ГДЕ
    Документ.Реквизит = &НеобходимоеЗначениеРеквизита
    И НЕ Документ.Ссылка В (&ЛюбойОтборСпискаДокументов)


Т.е. тут отбираются все документы и только потом на таблицу накладывается отбор (документов туча). Как можно оптимизировать по скорости?
sava1
1. Индексировать по реквизиту.
2. Уйти от конструкции НЕ в .....
Sympho
Изменил запрос на:

ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДоки
ИЗ
    Документ.ЛюбойДокумент КАК Документ
ГДЕ
    Документ.Ссылка = &НеобходимоеЗначениеРеквизита
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТДоки.Ссылка
ИЗ
    ВТДоки КАК ВТДоки
ГДЕ
    НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)


Стало выполняться больше чем на порядок быстрей. Не знаю, правда, насколько это правильно...
Vofka
Цитата(Sympho @ 18.10.17, 12:33) необходимо зарегистрироваться для просмотра ссылки
Изменил запрос

По-моему, какая-то ерунда получилась, которая по своему смыслу ещё и отличается от первоначального запроса.
Sympho
Это я уже понял что хрень какая-то вышла, надо подышать)
Sympho
Там в условии Документ.Реквизит, опечатался. Но, в итоге все равно по скорости отрабатывает одинаково.
Итого, насколько я понял, альтернативы нет.
sava1
Цитата(Sympho @ 18.10.17, 14:43) необходимо зарегистрироваться для просмотра ссылки
альтернативы нет.


Чему ?

В таком варианте время выборки зависит от размера списка ЛюбойОтборСпискаДокументов
Цитата(Sympho @ 18.10.17, 12:33) необходимо зарегистрироваться для просмотра ссылки
ГДЕ НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)


Выбирете все документы из списка во временную таблицу
Потом соедините с основной выборкой по NULL
Sympho
sava1 @ Сегодня, 14:16 необходимо зарегистрироваться для просмотра ссылки ,
Спасибо, попробую.
А если нет списка? Т.е. просто:

ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка
ИЗ
    Документ.ЛюбойДокумент КАК Документ
ГДЕ
    Документ.Реквизит = &СсылкаНаДругойДокумент



Такое не ускоряется? Просто в базе десятки тысяч документов.
Flexy
Цитата(Sympho @ 18.10.17, 11:33) необходимо зарегистрироваться для просмотра ссылки
Изменил запрос на:

Имхо, не верная логика. Для начала нужно ограничить список документов (первый пакет запроса - виртуальная таблица + индекс по нужному полю). Вторым пакетом - отбор с условием по нужному значению поля.
andr_andrey
sava1 @ 18.10.17, 15:16 необходимо зарегистрироваться для просмотра ссылки ,
Цитата(sava1 @ 18.10.17, 15:16) необходимо зарегистрироваться для просмотра ссылки
В таком варианте время выборки зависит от размера списка ЛюбойОтборСпискаДокументов
Цитата(Sympho @ 18.10.17, 12:33) *
ГДЕ НЕ ВТДоки.Ссылка В (&ЛюбойОтборСпискаДокументов)


Выбирете все документы из списка во временную таблицу
Потом соедините с основной выборкой по NULL

Насколько помню, SQL server даёт одинаковые планы выражению "В" и соединению с отбором по NULL. (в прошлом это меня приятно удивило по сравнению с mysql, который так делать не умел, и в рекомендациях была такая оптимизация).
sava1
Цитата(andr_andrey @ 20.10.17, 18:44) необходимо зарегистрироваться для просмотра ссылки
одинаковые планы выражению "В" и соединению с отбором по NULL


Да, но не по "НЕ В"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.