Странный план запроса

1. triviumfan 95 17.11.21 09:46 Сейчас в теме
Доброго дня.

Альфа-авто, 8.3.18.1483, режим совместимости 8.3.6.
Есть некая управляемая форма с динамическим списком.
Запрос типа
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
ГДЕ
<Выражение по Т2.НекоеПоле>
Показать

В некоторых случаях запрос выполняется 20 секунд. Судя по плану, то планировалось просканировать кластерный индекс в виде 143 тыс. строк, а фактически 61 млн.
Но как такое возможно, если в таблице УРВ_ПакетРабот (_Document5983) всего лишь 143 тыс. строк? Откуда в плане 61 млн?
ЗЫ : Индексы обслуживаются, автообновление статистики включено, но я ещё и сам принудительно обновил.
Прикрепленные файлы:
21111615.log
По теме из базы знаний
Найденные решения
5. spacecraft 17.11.21 10:17 Сейчас в теме
(4)
Можно подробнее как высчитывается сие число?

143000 * 429 = 61347000


(4)
Нет, там лишь
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ

Это вообще "песня" для оптимизатора.

Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.

Как пример оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
    И НЕ Т2.Проведен
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 17.11.21 09:57 Сейчас в теме
(1)
Но как такое возможно, если в таблице УРВ_ПакетРабот (_Document5983) всего лишь 143 тыс. строк? Откуда в плане 61 млн?

Смотрите следующие столбцы на скрине. Вызовы факт. Вот и получается 61 млн.

Ну а по запросу...
Там еще скорее всего и в секции где используется ИЛИ.
4. triviumfan 95 17.11.21 10:08 Сейчас в теме
(3)
Смотрите следующие столбцы на скрине. Вызовы факт. Вот и получается 61 млн.

Можно подробнее как высчитывается сие число?

(3)
Там еще скорее всего и в секции где используется ИЛИ.

Нет, там лишь
И ВЫБОР
			КОГДА УРВ_ПакетРабот.Проведен
				ТОГДА ЛОЖЬ
			ИНАЧЕ ИСТИНА
		КОНЕЦ
5. spacecraft 17.11.21 10:17 Сейчас в теме
(4)
Можно подробнее как высчитывается сие число?

143000 * 429 = 61347000


(4)
Нет, там лишь
И ВЫБОР
КОГДА УРВ_ПакетРабот.Проведен
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ

Это вообще "песня" для оптимизатора.

Если перевести на русский весь текст запроса, то получится следующее:
Возьми все записи из Т1, соедини с Т2.
Из полученного результат выбери только записи по сложному выбору "ВЫБОР".
Из полученного результат выбери только 1000 записей.

Как пример оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 1000
Т.Ссылка
Из
Документ.ЗаказНаряд КАК Т
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.УРВ_ПакетРабот КАК Т2
ПО Т.Ссылка = Т2.ДокументОснование
    И НЕ Т2.Проведен
6. triviumfan 95 17.11.21 10:22 Сейчас в теме
(5)
143000 * 429 = 61347000

А откуда столько вызовов, 429?
7. spacecraft 17.11.21 10:23 Сейчас в теме
(6) из неоптимального запроса.
8. triviumfan 95 17.11.21 10:26 Сейчас в теме
(5)
Это вообще "песня" для оптимизатора.

И песни здесь никакой нет) не нужно недооценивать оптимизатор. Он гораздо умнее, и запрос выполняется за 0.1 секунду с учетом того, что в запросе участвуют куча толстых таблиц, не везде индекс используется, плюс срез последних.
Тут особенность в том, что это динамический список и пользователь делает поиск в нём.
9. spacecraft 17.11.21 10:29 Сейчас в теме
(8) тогда зачем создали этот вопрос? Проблем же нет?
10. triviumfan 95 17.11.21 10:48 Сейчас в теме
(9) теперь я понял, откуда столько фактических строк. Спасибо. Но исправлю я его сам :)
11. Sashares 35 17.11.21 11:00 Сейчас в теме
(1)
ВЫБРАТЬ ПЕРВЫЕ 1000

В динамическом списке ключевое слово Первые игнорируется.
12. spacecraft 17.11.21 11:14 Сейчас в теме
(11) оно бы ошибку выдавало. Возможно этот запрос во вложенном запросе или во временной таблице.
13. triviumfan 95 17.11.21 11:52 Сейчас в теме
(11)
С чего вдруг? Исходный запрос содержит TOP 1000
А, не так понял вопрос. Пардон.
14. Sashares 35 17.11.21 11:54 Сейчас в теме
(13)
С чего вдруг?

Вот так вот работает динамический список в платформе.
В ранних релизах ошибку на "Первые" в тексте динамического списка не выдает, просто игнорирует, а в актуальных при редактировании текста запроса сразу выдает ошибку.
triviumfan; +1 Ответить
15. Дмитрий74Чел 237 02.12.21 15:59 Сейчас в теме
(1) На картинке с таблицей плана запроса в выделеной строке видно что ожидалось 1 выполнение, а выполнено 429 раз. Далее ищем почему 429 (выше) находим строки где ожидалось получить 1 запись а получено 429.
Вывод: по этой таблице/таблицам статистика устарела или индекс плохой. Строки 24-26.
2. triviumfan 95 17.11.21 09:50 Сейчас в теме
Пока писал, то обнаружил, что в запрос передаются параметры типа '%215%', а это поиск в списке.
Динамическое считывание отключено, основной таблицы нет.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот