我有一个使用 3 个函数和下面几个不同视图的查询,这些视图太复杂,无法在此处发布。我遇到的奇怪的事情是在运行顶级查询时,拥有超过 1 个搜索键会导致查询需要大约一个小时才能运行,而将查询分成两部分每个查询大约需要 5 秒。
这是顶级查询:
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 分钟