2012-07-07 39 views
0

我不知道这是否是一个SQL Server的错误或我的错,但这里的情况是:SQL服务器:单独的查询返回在不到一秒钟,但结合那些INTERSECT需要3分钟

查询1

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

这需要小于0.5秒,并返回20000个记录

QUERY 2

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

这需要不到1秒,并返回500条记录

问题 如果我们加入这两个查询与相交,时间超过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"')) 
) 
+3

请张贴所有三个图形执行计划。 – usr 2012-07-07 12:41:06

+0

您是否有意使用NOLOCK,并充分了解其局限性,或者是一个精灵灰尘涡轮按钮? – 2012-07-07 20:47:53

回答

1

以下查询等同,应该跑得更快

SELECT * FROM PI_INFORM WITH (NOLOCK) 
WHERE 
PK IN (SELECT PK FROM dbo.getInformFullTextPKs('"HELLO"')) AND 
RECORD_DATE>DATEADD(hour,-48, GETDATE()) 
+0

好主意。原始查询中的一个连接是多余的。 – usr 2012-07-07 15:11:27