Я не уверен, является ли это ошибкой 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"'))
)