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 查询优化为不到一秒。

带有时间戳和变量的 SQL Server 查询性能

oracle sql Developer花时间获取所有记录

Graphite 在不到一秒的时间间隔内聚合数据

SQL Server "<>" 运算符与具有几百万行的表上的 "=" 相比非常慢

为啥 SQL Server 表值函数插入需要很长时间?