powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса с коррелированными подзапросами
8 сообщений из 8, страница 1 из 1
Оптимизация SQL запроса с коррелированными подзапросами
    #39702830
Valentina.Yu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Имеется большой запрос, который очень требует оптимизации.
Ниже пример части запроса, на которой подвисает.
В реальных таблицах десятки миллионов строк данных.
Пробовала переписать и в JOIN, и в CTE, но из-за аггрегатных функций и мудреных условий, толково это сделать не удалось.
Не увенчались успехом и манипуляции с индексами, тк особого опыта в оптимизации не имею

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT (SELECT MIN(CASE WHEN tab1.col1 = 0 THEN 0 ELSE 1 END) 
        FROM tab1 
		WHERE tab1.col2 = tab2.col2
          AND (tab2.col1 <> 1 OR (SELECT COUNT(*) FROM tab1 AS p1 WHERE tab1.col4 = p1.col4) = 0)
          AND (tab1.col3 = 1 OR tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < tab1.col5)
		) col_alias
FROM tab2




Также прикрепляю Execution plan


Может у кого-то есть идеи в какое русло вообще двигать все это?
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39702831
Valentina.Yu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39702853
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentina.YuМожет у кого-то есть идеи в какое русло вообще двигать все это?Вообще то никаких условий в запросе нет, поэтому должны просканироваться все участвующие таблицы, и во всем строкам сделаны вычисления. Это будет небыстро, в любом случае.
А так - делать индексы по колонкам, участвующим в связях, делать include-индексы, может, получится использовать индексированные представления для агрегатов.

PS Кстати, у вас условие (SELECT COUNT(*) FROM tab1 AS p1 WHERE tab1.col4 = p1.col4) = 0) всегда ложно.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39702980
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgPS Кстати, у вас условие (SELECT COUNT(*) FROM tab1 AS p1 WHERE tab1.col4 = p1.col4) = 0) всегда ложно.

И, как следствие, второй подзапрос
Код: sql
1.
 ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < tab1.col5


тоже бесполезен. Можно убрать.

Вот и оптимизировали.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39702984
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эквивалент исходного запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT (SELECT MIN(CASE WHEN tab1.col1 = 0 THEN 0 ELSE 1 END) 
        FROM tab1 
		WHERE tab1.col2 = tab2.col2
          AND (tab2.col1 <> 1 )
          AND (tab1.col3 = 1 )
		) col_alias
FROM tab2
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39703073
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222И, как следствие, второй подзапрос
Код: sql
1.
 ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < tab1.col5


тоже бесполезен. Можно убрать.Хм, а почему это? Вы не спутали tab1.col3 и tab3.col1?
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39703086
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
AND (tab2.col1 <> 1 OR (SELECT COUNT(*) FROM tab1 AS p1 WHERE tab1.col4 = p1.col4) = 0)
          AND (tab1.col3 = 1 OR tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < tab1.col5)



Код: sql
1.
2.
AND (tab2.col1 <> 1 OR FALSE)
          AND (tab1.col3 = 1 OR tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < tab1.col5)



Код: sql
1.
2.
3.
AND tab2.col1 <> 1 
          AND (tab1.col3 = 1 OR tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < 
tab1.col5)



Код: sql
1.
2.
3.
AND tab2.col1 <> 1 
          AND (tab1.col3 = 1 OR (tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < 
tab1.col5) )



Код: sql
1.
2.
3.
AND tab2.col1 <> 1 
          AND (tab1.col3 = 1 OR (FALSE AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < 
tab1.col5) )



Код: sql
1.
2.
AND tab2.col1 <> 1 
          AND tab1.col3 = 1
...
Рейтинг: 0 / 0
Оптимизация SQL запроса с коррелированными подзапросами
    #39703108
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Код: sql
1.
2.
3.
AND tab2.col1 <> 1 
          AND (tab1.col3 = 1 OR (tab2.col1 = 0 AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < 
tab1.col5) )


Код: sql
1.
2.
3.
AND tab2.col1 <> 1 
          AND (tab1.col3 = 1 OR (FALSE AND ISNULL((SELECT SUM(tab3.col1) FROM tab3 WHERE tab3.col1 = tab2.col2),0) < 
tab1.col5) )

Всё равно не понял, почему tab2.col1 = 0 всегда FALSE?
Если бы tab2.col1 имел тип BIT, то tab2.col1 = 0 было бы всегда TRUE, потому что выше tab2.col1 <> 1
Но его тип неизвестен, и уж тем более выражение не FALSE
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса с коррелированными подзапросами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]