powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса с OR
6 сообщений из 6, страница 1 из 1
Оптимизация запроса с OR
    #40097653
tnik_28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Больше 3 часов выполнялся запрос с OR, переписали через UNION - за секунду выполняется.
Практически все тормоза в проекте из-за подобных случаев. Получается на больших данных оператор OR вообще нельзя использовать в mssql?

Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table tx1(
id int IDENTITY primary key,
x1 int,
x2 int)
go

Declare @i int=0
SELECT RAND(100)
WHILE @i <30000  
   BEGIN  
      Set @i=@i+1
      Insert into tx1 values(RAND()*10000000,RAND()*10000000)
   END; 

-- 45 sec
select * from tx1 t1
inner join tx1 t2 on(t1.x1=t2.x1 or t1.x2=t2.x2)  and t1.id!=t2.id

-- <1 sec
select * from tx1 t1
inner join tx1 t2 on(t1.x1=t2.x1)  and t1.id!=t2.id
union
select * from tx1 t1
inner join tx1 t2 on(t1.x2=t2.x2)  and t1.id!=t2.id



Так как запросы большие, не хочется дублировать кучу кода через UNION, особенно если не один OR.
Есть ли другие варианты?
...
Рейтинг: 0 / 0
Оптимизация запроса с OR
    #40097670
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tnik_28,

сравните планы запросов, увидите разницу.
...
Рейтинг: 0 / 0
Оптимизация запроса с OR
    #40097677
tnik_28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
tnik_28,

сравните планы запросов, увидите разницу.

OR через Table Spool , Union через Hash match выполняется. Но как это поменять без существенной модификации запроса с OR.
...
Рейтинг: 0 / 0
Оптимизация запроса с OR
    #40097685
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tnik_28
Но как это поменять без существенной модификации запроса с OR.
Никак.
Потому что с такими предикатами возможен только Nested Loops.
...
Рейтинг: 0 / 0
Оптимизация запроса с OR
    #40097772
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tnik_28,

если вы указали такой предикат, то возможен лишь перебор подходящих значений множества Б для каждого элемента множества А. Для такого предиката невозможно выполнить ни сравнение слиянием или расчетом хэш ни протолкнуть его в постобработку.
...
Рейтинг: 0 / 0
Оптимизация запроса с OR
    #40098168
tnik_28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно именно 2 отдельных индекса и FORCESEEK указать

CREATE NONCLUSTERED INDEX IX_tx1 ON tx1 (x1);
CREATE NONCLUSTERED INDEX IX_tx2 ON tx1 (x2);

select * from tx1 t1 WITH (FORCESEEK)
inner join tx1 t2 on(t1.x1=t2.x1 or t1.x2=t2.x2) and t1.id!=t2.id
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса с OR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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