Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация условия / 7 сообщений из 7, страница 1 из 1
16.12.2021, 18:12
    #40120745
alazanskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
Всем привет. Нужно привести один запрос в нормальный вид. Примерная схема:

Код: sql
1.
2.
3.
4.
5.
  .....тяжёлый запрос
  LEFT JOIN TableA ON...
  LEFT JOIN TABLEB ON...
  WHERE
    (SELECT COUNT(*) FROM TableX) = 0 OR TableB.SomeField IN (SELECT Field FROM TableX)



Как я понимаю, это условие оптимально разбивать на
Код: sql
1.
2.
3.
4.
5.
6.
   .....тяжёлый запрос
   UNION
   .....тяжёлый запрос
   JOIN TableA ON...
   JOIN TABLEB ON...
   JOIN TableX ON...



или такое условие как-то ещё оптимальнее упрощается? Просто не хотелось бы два раза повторяться в тексте с этим вот "тяжелым запросом"
...
Рейтинг: 0 / 0
16.12.2021, 18:26
    #40120757
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
alazanskiy,

что б не повторяться используйте СТЕ,
хотя пока не очень понятно о чем речь
...
Рейтинг: 0 / 0
16.12.2021, 18:29
    #40120759
alazanskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
PizzaPizza,

два раза обращаться к CTE не очень идея. Речь об оптимизации скорости, вот это вот условие с большим количество лефт джоинов очень медленно работает.
...
Рейтинг: 0 / 0
16.12.2021, 19:47
    #40120790
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
alazanskiy
Всем привет. Нужно привести один запрос в нормальный вид. Примерная схема:

Код: sql
1.
2.
3.
4.
5.
  .....тяжёлый запрос
  LEFT JOIN TableA ON...
  LEFT JOIN TABLEB ON...
  WHERE
    (SELECT COUNT(*) FROM TableX) = 0 OR TableB.SomeField IN (SELECT Field FROM TableX)




Запись чудо-условия умиляет.

Код: sql
1.
2.
  WHERE
    not exists (SELECT * FROM TableX) or  ( TableB.SomeField is not null  and exists( SELECT * FROM TableX where Field = TableB.SomeField ) )



Если "тяжелый запрос" написан тем же слогом - можно только выразить сочувствие серверу.
...
Рейтинг: 0 / 0
16.12.2021, 20:34
    #40120807
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
alazanskiy

два раза обращаться к CTE не очень идея.

только не говорите об этом серверу

alazanskiy
Речь об оптимизации скорости, вот это вот условие с большим количество лефт джоинов очень медленно работает.

вариант с разбитием запроса на куски с последовательной обработкой данных и сливом во временные таблицы для дальнейшей работы рассматривается?
...
Рейтинг: 0 / 0
16.12.2021, 21:01
    #40120819
alazanskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
andy st,

Так и сделал.
...
Рейтинг: 0 / 0
16.12.2021, 22:05
    #40120824
notemac
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация условия
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
IF NOT EXISTS (SELECT 1 FROM TableX)
BEGIN
  .....тяжёлый запрос
  LEFT JOIN TableA ON...
  LEFT JOIN TABLEB ON...
END
ELSE
BEGIN
  .....тяжёлый запрос
  LEFT JOIN TableA ON...
  LEFT JOIN TABLEB ON...
  WHERE
    TableB.SomeField IN (SELECT Field FROM TableX)
END


Если 'SELECT Field FROM TableX' возращает много строк, то лучше поменять на INNER JOIN, либо на WHERE EXISTS как у aleks222
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация условия / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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