Сегодня пришлось оптимизировать свой запрос, который выполнялся 34 секунды.
Приведу его изначальные характеристики:
- 3 среза последних
- 1 вложенный запрос
- 3 левых соединения
- РАЗЛИЧНЫЕ в первой выборке
- 7 условий по параметрам+1 по определенному в запросе значению
- Начальная выборка 215000->19000 результирующих, которые затем средствами СКД группировались в более скромную выборку
Итерации поиска причин
Подозрение вызвали соединения, убрал – нулевой результат.
Ушел от вложенного запроса – нулевой результат.
Ушел от полей в выборке через точку – 0.
Ушел от РАЗЛИЧНЫЕ – 0.
Условия в запросе по реквизитам Регистра сведений, проверил – Индексируются на уровне базы данных.
В итоге, от изначального запроса остался запрос срез последних с условиями ГДЕ (через параметры виртуальной таблицы условия не при применимы по логике требуемого результата).
Думаю “эврика”, медленно срез последних выполняется, но ничего не поделаешь же, формирую без условий – моментально.
Перебираю комбинации из 3 условий – только замедление.
Вспоминаю про ИНДЕКСИРОВАТЬ ПО, которые обычно использовал при соединениях, но и в этих случаях не всегда давало заметный результат, возможно из-за характеристик платформы/кэширования MSSQL – сервера.
Исправляю запрос:
Получение данных срезом вообще без условий (215000)->Помещение во временную таблицу с индексацией 3 полей-Выборка из временной с наложением условий.
Ускорение в 15 раз (с 34 секунд до 2,27) на работающей системе ~ 141 пользователей, даже когда вернул все соединения и условия.
А вообще, изначально думал проблема в том, что в СКД закидывается большой объем данных из таблицы значений, а пришлось препарировать запрос.
На всякий случай приведу параметры системы: Платформа 8.3.5.1068, Intel XEON E3-1220 v2, 32 GB ОЗУ, windows/MSSQL/2012 64bit, 1С 32 bit, всё на одном сервере.
Не понятно только почему не работает индексирование реквизитов на уровне базы данных или все-таки работает, а при отсутствии было бы гораздо медленней.
UPD 20/12/2015:
На неделе столкнулся с ситуацией, когда обрабатывался регистр сведения по истории реквизитов документов, обрабатывалось единовременно более 93000 документов, с 30-50 хранимых реквизитов, добавление индексации давало замедление в 2 раза.
Вывод: надо подходить к различным задачам индивидуально, в данном случае затраты на индексирование были неоправданы
Люди кончают самоубийством оттого, что получают по почте одну рекламу.