Информация об изменениях

Сообщение mssql сильно тормозит OR от 14.09.2021 1:55

Изменено 14.09.2021 15:58 tnikolai

mssql сильно тормозит OR
Если в join есть OR типа
inner join tbl1 on(a=b OR c=d)
mssql ужасно тормозит, такая проблема часто возникает.

Целый час выполняется запрос
Переписали через Union
. . .
inner join tbl1 on(a=b)
UNION
. . .
inner join tbl1 on(a=b)
выполняется за несколько секунд

Почему mssql не может оптимизировать OR?
Не хочется использовать вариант с UNION так как запросы большие и может быть много OR — будет куча дублированного кода.
Иногда помогает OPTION(TABLE HINT . . . но тоже не очень удобный вариант.
Есть ли что-то получше?
mssql сильно тормозит OR
Если в join есть OR типа
inner join tbl1 on(a=b OR c=d)
mssql ужасно тормозит, такая проблема часто возникает.

Целый час выполняется запрос
Переписали через Union
. . .
inner join tbl1 on(a=b)
UNION
. . .
inner join tbl1 on(a=b)
выполняется за несколько секунд

Почему mssql не может оптимизировать OR?
Не хочется использовать вариант с UNION так как запросы большие и может быть много OR — будет куча дублированного кода.
Иногда помогает OPTION(TABLE HINT . . . но тоже не очень удобный вариант.
Есть ли что-то получше?

Пример

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;

CREATE NONCLUSTERED INDEX IX_tx1 ON tx1 (x1,x2);
GO

-- 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