SQL Server: почему этот запрос так медленно?

98
4

У меня есть оператор SQL, чтобы вытащить записи. Некоторые сотрудники имеют доступ к определенным записям. Безопасность персонала выполняется в отдельном процессе и привязана к предложению where предложения SQL.

Упрощенный пример:

select 
o.id, o.staff.id
from
Orders o
where
staffid = 100
or orderid in (select orderid from schedule where staffid = 5)

против

select 
o.id, o.staff.id
from
Orders o
where
staffid = 100 or orderid in (1, 2, 3, 4, 5, 6, 7, 8)

Вложенный sql select orderid from schedule where teamid = 5 работает за 1 секунду. Если вы вставляете результат на свое место, основной запрос запускается через 2 секунды. Если вы запустите верхний SQL, вам потребуется минута для запуска. По какой-то причине, как вы указываете SQL для запуска вложенного выбора сначала, не разбивая его на временную таблицу?

Дополнительная информация из всех ваших предложений:

У моего SQL также есть OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY. При удалении запрос выполняется быстро. Он может вернуть 1800 записей за 1 секунду, но запросить 10 записей занимает 40 секунд.

Если я изменю свой заказ на staffid он будет работать быстро. Комбинация order by и fetch next приводит к тому, что SQL выполняет другой план выполнения. Поскольку предложение Where находится в отдельной части программного обеспечения, и я не могу изменить order by, он убивает производительность.

спросил(а) 2021-01-25T14:39:19+03:00 4 месяца, 3 недели назад
1
Решение
117

SELECT o.id, o.staffId 
FROM Orders o
WHERE o.staffid = 100
OR EXISTS ( SELECT 'a'
FROM schedule s
WHERE s.staffId = 5
AND s.orderId = o.orderId
)

Изменить... Версия соединения быстрее?


SELECT DISTINCT o.*
FROM Orders o JOIN schedule s ON s.orderId = o.orderId
WHERE o.staffid = 100
OR s.staffId = 5

Сколько строк имеет ваши таблицы?

ответил(а) 2021-01-25T14:39:19+03:00 4 месяца, 3 недели назад
45

with    scheduleOrders as 
(select orderid from schedule where staffid = 5)
select o.id, o.staff.id
from Orders o
where o.staffId = 100
union
select o.id, o.staff.id
from Orders o join scheduleOrders so on o.orderId = so.orderId

ответил(а) 2021-01-25T14:39:19+03:00 4 месяца, 3 недели назад
45

Попробуйте использовать Exists

Select o.id, o.staff.id 
from Orders o
Where staffid = 100 or EXISTS (select 1 from schedule s where staffid = 5 and s.orderid=o.orderid)

С помощью In он пытается получить весь результат внутреннего запроса, тогда как с Exists он будет проверять только, существует ли строка

ответил(а) 2021-01-25T14:39:19+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема