我在表格中有很多记录。当我执行以下查询时,需要花费很多时间。如何提高性能?
SET ROWCOUNT 10
SELECT StxnID
,Sprovider.description as SProvider
,txnID
,Request
,Raw
,Status
,txnBal
,Stxn.CreatedBy
,Stxn.CreatedOn
,Stxn.ModifiedBy
,Stxn.ModifiedOn
,Stxn.isDeleted
FROM Stxn,Sprovider
WHERE Stxn.SproviderID = SProvider.Sproviderid
AND Stxn.SProviderid = ISNULL(@pSProviderID,Stxn.SProviderid)
AND Stxn.status = ISNULL(@pStatus,Stxn.status)
AND Stxn.CreatedOn BETWEEN ISNULL(@pStartDate,getdate()-1) and ISNULL(@pEndDate,getdate())
AND Stxn.CreatedBy = ISNULL(@pSellerId,Stxn.CreatedBy)
ORDER BY StxnID DESC
stxn表有超过100,000条记录。
查询是从asp.net c#中的报表查看器运行的。
答案 0 :(得分:4)
当我尝试进行具有多个搜索条件的搜索查询时,这是我的首选文章。
http://www.sommarskog.se/dyn-search-2008.html
您的查询的最大问题是column=ISNULL(@column, column)
语法。 MSSQL不会使用索引。请考虑将其更改为(column = @column AND @column IS NOT NULL)
答案 1 :(得分:3)
您应该考虑使用执行计划并查找缺少的索引。此外,执行需要多长时间?什么对你来说很慢?
也许你也不能返回那么多行,但这只是猜测。实际上,我们需要查看您的表和索引以及执行计划。
答案 2 :(得分:3)
首先,使用SELECT TOP ()
代替SET ROWCOUNT
- 优化器将有更好的机会。另一个建议是使用正确的内连接,而不是使用旧样式表,表连接语法结束使用笛卡尔积(这不是这里的情况,但使用旧语法可以更容易)。应该是:
...
FROM Stxn INNER JOIN Sprovider
ON Stxn.SproviderID = SProvider.Sproviderid
...
如果您认为100K行很多,或者说这个音量是缓慢的原因,那你就错了。很可能你的索引策略确实很差,可能是一些参数嗅探,可能是一些隐式转换......如果不了解数据类型,索引和查看计划,很难说清楚。
答案 3 :(得分:3)
有很多事情可能会影响查询的性能。虽然100k的记录真的不是那么多。
要考虑的项目(无特定顺序)
硬件:
数据库结构:
网络强>
常规强>
基本上,如果没有你提出的很多问题,就不可能给出一个难以回答的答案。如果您分析查询,了解返回客户端的内容和数量,并观察各个部分之间的交互,所有这些都将证明。
最后,根据返回客户端的数据量,可能无法提高硬件更改的性能。
答案 4 :(得分:0)
确保Stxn.SproviderID,Stxn.status,Stxn.CreatedOn,Stxn.CreatedBy,Stxn.StxnID和SProvider.Sproviderid都定义了索引。
(注意 - 你可能不需要所有,但它不会受到伤害。)
答案 5 :(得分:0)
我没有看到可以对查询本身做多少,但我可以看到在架构上完成的事情:
答案 6 :(得分:0)
需要考虑的事项:当ROWCOUNT或TOP与ORDER BY子句一起使用时,首先创建并排序整个结果集,然后返回前10个结果。
如果没有Order By子句,它如何运行?