我有一个查询,使用了3个函数和一些不同的视图,在此不方便公开。奇怪的是,当运行顶层查询时,拥有多个搜索关键字导致该查询需要花费约1小时才能运行,而将查询分成两部分后,每个查询只需要大约5秒钟。
以下是顶层查询:
当我添加这个where子句时:
查询需要大约3秒钟才能运行。同样地,当我添加这个where子句时:
我必须在大约50分钟后停止查询,而且它从未返回任何结果。
这是在运行SQL Server 2008 R2 Express的远程客户端服务器上发生的。当我本地运行它(也在SQL Server 2008 R2 Express上),我没有遇到巨大的延迟,最后一个where子句需要约30秒才能返回。但客户端拥有比我更多的数据。
有任何解决问题的想法吗?
编辑:
根据下面的评论,我重建了索引和统计信息,这提高了前两个where子句的性能,但对第三个没有影响。然后我尝试修改查询,并发现如果我将其重写为:
以下是顶层查询:
Select *
from dbo.vwSimpleInvoice i
inner join dbo.vwRPTInvoiceLineItemDetail d on i.InvoiceID = d.InvoiceID
当我添加这个where子句时:
Where i.InvoiceID = 109581
查询需要大约3秒钟才能运行。同样地,当我添加这个where子句时:
Where i.InvoiceID = 109582
需要大约3秒钟时间。
但是当我添加了这个where子句:
Where i.InvoiceID in (109581, 109582)
我必须在大约50分钟后停止查询,而且它从未返回任何结果。
这是在运行SQL Server 2008 R2 Express的远程客户端服务器上发生的。当我本地运行它(也在SQL Server 2008 R2 Express上),我没有遇到巨大的延迟,最后一个where子句需要约30秒才能返回。但客户端拥有比我更多的数据。
有任何解决问题的想法吗?
编辑:
根据下面的评论,我重建了索引和统计信息,这提高了前两个where子句的性能,但对第三个没有影响。然后我尝试修改查询,并发现如果我将其重写为:
Select *
from dbo.vwSimpleInvoice i
inner join
(Select * from dbo.vwRPTInvoiceLineItemDetail) d on i.InvoiceID = d.InvoiceID
Where i.InvoiceID in (109581, 109582)
性能回到了预期水平,大约在200毫秒左右。现在我比以往任何时候都更加困惑发生了什么...
编辑2:
实际上,我错了。不是像那样重写查询语句,而是我在重写过程中意外更改了Where子句为:
Where d.InvoiceID in (109581, 109582)
(将i
更改为d
)。
我仍然有点不明白为什么在内部连接上会产生如此巨大的差异?
进一步编辑:
继续尝试,我仍然无法理解。
Select InvoiceId from tblInvoice Where CustomerID = 2000
返回:
80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(80442, 4988, 98497, 102483, 102484, 107958, 127063, 168444, 168531, 173382, 173487, 173633, 174013, 174160, 174240, 175389)
运行时间:31 行返回 110 毫秒
Select * from dbo.vwRPTInvoiceLineItemDetail
Where InvoiceID in
(Select InvoiceId from tblInvoice Where CustomerID = 2000)
运行结果:返回31行,耗时65分钟。