SQL Server:单独的查询在不到一秒的时间内返回,但将这些查询与 INTERSECT 组合需要 3 分钟
Posted
技术标签:
【中文标题】SQL Server:单独的查询在不到一秒的时间内返回,但将这些查询与 INTERSECT 组合需要 3 分钟【英文标题】:SQL Server: Seperate queries return in less than a second but combining those with INTERSECT takes 3 mins 【发布时间】:2012-07-07 12:18:56 【问题描述】:我不确定这是 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"'))
)
【问题讨论】:
请贴出这三个的图形执行计划。 您是故意使用 NOLOCK,充分了解其局限性,还是将其用作精灵尘埃 turbo 按钮? 【参考方案1】:以下查询是等效的,应该运行得更快
SELECT * FROM PI_INFORM WITH (NOLOCK)
WHERE
PK IN (SELECT PK FROM dbo.getInformFullTextPKs('"HELLO"')) AND
RECORD_DATE>DATEADD(hour,-48, GETDATE())
【讨论】:
好主意。原始查询中的连接之一是多余的。以上是关于SQL Server:单独的查询在不到一秒的时间内返回,但将这些查询与 INTERSECT 组合需要 3 分钟的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch我们如何将 100 秒的 elasticsearch 查询优化为不到一秒。