SQL Server: отдельные запросы возвращаются менее чем за секунду, но их объединение с INTERSECT занимает 3 минуты.

Я не уверен, является ли это ошибкой SQL Server или моей ошибкой, но вот ситуация:

ЗАПРОС 1

select PK FROM PI_INFORM  WHERE RECORD_DATE>DATEADD(hour,-48, GETDATE())

это занимает менее 0,5 секунды и возвращает 20 000 записей.

ЗАПРОС 2

SELECT PK FROM dbo.getInformFullTextPKs('"HELLO"')

это занимает менее 1 секунды и возвращает 500 записей

ПРОБЛЕМА Если мы объединим эти два запроса с помощью INTERSECT, это займет более 3 минут. Планы выполнения показывают, что все выполняется с использованием INDEX SEEK.

SELECT * FROM PI_INFORM WITH (NOLOCK)
WHERE PK IN (

select PK FROM PI_INFORM  WHERE RECORD_DATE>DATEADD(hour,-48, GETDATE())

INTERSECT

SELECT PK FROM PI_INFORM WHERE PK IN (SELECT PK FROM dbo.getInformFullTextPKs('"HELLO"'))
)

person meraydin    schedule 07.07.2012    source источник
comment
Пожалуйста, опубликуйте графические планы выполнения всех трех.   -  person usr    schedule 07.07.2012
comment
Вы используете NOLOCK специально, с полным пониманием его ограничений, или как турбо-кнопку пикси-пыль?   -  person Aaron Bertrand    schedule 08.07.2012


Ответы (1)


следующий запрос эквивалентен и должен выполняться быстрее

SELECT * FROM PI_INFORM WITH (NOLOCK)
WHERE 
PK IN (SELECT PK FROM dbo.getInformFullTextPKs('"HELLO"')) AND 
 RECORD_DATE>DATEADD(hour,-48, GETDATE())
person iruvar    schedule 07.07.2012
comment
Отличная идея. Одно из объединений в исходном запросе было избыточным. - person usr; 07.07.2012