Доброго дня.
Альфа-авто, 8.3.18.1483, режим совместимости 8.3.6.
Есть некая управляемая форма с динамическим списком.
Запрос типа
В некоторых случаях запрос выполняется 20 секунд. Судя по плану, то планировалось просканировать кластерный индекс в виде 143 тыс. строк, а фактически 61 млн.
Но как такое возможно, если в таблице УРВ_ПакетРабот (_Document5983) всего лишь 143 тыс. строк? Откуда в плане 61 млн?
ЗЫ : Индексы обслуживаются, автообновление статистики включено, но я ещё и сам принудительно обновил.
Альфа-авто, 8.3.18.1483, режим совместимости 8.3.6.
Есть некая управляемая форма с динамическим списком.
Запрос типа
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
ГДЕ
<Выражение по Т2.НекоеПоле>
ПоказатьВ некоторых случаях запрос выполняется 20 секунд. Судя по плану, то планировалось просканировать кластерный индекс в виде 143 тыс. строк, а фактически 61 млн.
Но как такое возможно, если в таблице УРВ_ПакетРабот (_Document5983) всего лишь 143 тыс. строк? Откуда в плане 61 млн?
ЗЫ : Индексы обслуживаются, автообновление статистики включено, но я ещё и сам принудительно обновил.
Прикрепленные файлы:
По теме из базы знаний
- Неоптимальности вида «план исполнения запроса "испортился"» - поиск и исправление
- Диспетчер Хранилища Запросов в SQL Server 2016+ (он же Query Store)
- Руководство по SQL: Как лучше писать запросы (Часть 1)
- Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах
- Избавиться от скана таблицы в плане запроса
Найденные решения
(4)
143000 * 429 = 61347000
(4)
Это вообще "песня" для оптимизатора.
Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.
Как пример оптимизации:
Можно подробнее как высчитывается сие число?
143000 * 429 = 61347000
(4)
Нет, там лишь
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
Это вообще "песня" для оптимизатора.
Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.
Как пример оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
И НЕ Т2.Проведен
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Смотрите следующие столбцы на скрине. Вызовы факт. Вот и получается 61 млн.
Ну а по запросу...
Там еще скорее всего и в секции где используется ИЛИ.
Но как такое возможно, если в таблице УРВ_ПакетРабот (_Document5983) всего лишь 143 тыс. строк? Откуда в плане 61 млн?
Смотрите следующие столбцы на скрине. Вызовы факт. Вот и получается 61 млн.
Ну а по запросу...
Там еще скорее всего и в секции где используется ИЛИ.
(4)
143000 * 429 = 61347000
(4)
Это вообще "песня" для оптимизатора.
Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.
Как пример оптимизации:
Можно подробнее как высчитывается сие число?
143000 * 429 = 61347000
(4)
Нет, там лишь
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
Это вообще "песня" для оптимизатора.
Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.
Как пример оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
И НЕ Т2.Проведен
(5)
И песни здесь никакой нет) не нужно недооценивать оптимизатор. Он гораздо умнее, и запрос выполняется за 0.1 секунду с учетом того, что в запросе участвуют куча толстых таблиц, не везде индекс используется, плюс срез последних.
Тут особенность в том, что это динамический список и пользователь делает поиск в нём.
Это вообще "песня" для оптимизатора.
И песни здесь никакой нет) не нужно недооценивать оптимизатор. Он гораздо умнее, и запрос выполняется за 0.1 секунду с учетом того, что в запросе участвуют куча толстых таблиц, не везде индекс используется, плюс срез последних.
Тут особенность в том, что это динамический список и пользователь делает поиск в нём.
(1) На картинке с таблицей плана запроса в выделеной строке видно что ожидалось 1 выполнение, а выполнено 429 раз. Далее ищем почему 429 (выше) находим строки где ожидалось получить 1 запись а получено 429.
Вывод: по этой таблице/таблицам статистика устарела или индекс плохой. Строки 24-26.
Вывод: по этой таблице/таблицам статистика устарела или индекс плохой. Строки 24-26.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот