Dus*_*tin 4 sql-server-2005 database-design
我遇到了一个选择语句运行时间太长的问题。我想知道我是否做错了什么,或者花这么长时间是否有意义。我使用的是 Microsoft SQL 2005 标准。我正在运行的选择需要大约 30 秒才能运行并返回大约 60000 条记录。这是sql:
SELECT l.ID, l.Number, l.Date, l.FirstName + ' ' + l.LastName Name,
isnull(l.Amount,0) Amount1, isnull(l.Interest,0) Interest1,
isnull(l.Interest2,0) Interest2, l.LastPayment,
l.NextDueDate, isnull(l.Aging,0) Aging, isnull(l.InterestRate,0) InterestRate,
ls.DisplayValue Status, lt.DisplayValue Type, l.LocationID
FROM Table1 l
JOIN Table2 ls ON (l.Table2ID=ls.ID)
JOIN Table3 lt ON (l.Table3ID=lt.ID)
WHERE
l.Table3ID IN (SELECT Value FROM fn_Split('5,4,3', ','))
AND l.Table2ID IN (SELECT Value FROM fn_Split('8,20,9,14,18,21,22,26,13,10,27,25,23,24,16,3,11,6,4,12,19,17,5,28,7,15', ','))
AND l.LocationID IN (SELECT Value FROM fn_Split('4,6,8,9,10,14,11,12,13', ','))
Run Code Online (Sandbox Code Playgroud)
我添加了索引,但似乎没有什么可以加快速度。如果我删除选择中除 l.ID 和 l.Number 之外的所有内容,我可以在大约 8 秒内完成它,如果这有帮助的话。这个 DBA 的东西不是我的专业领域,所以任何帮助都将不胜感激。谢谢你。
仅从外观上很难说,但这是找出从哪里开始的好方法:
在执行计划打开的情况下从 SSMS 运行您的查询(右键单击任意位置并选择“包括实际执行计划”)。从右到左,从上到下阅读。每个图标将显示一个百分比 - 找出查询花费最多时间的地方,然后从那里开始。
一般建议:尝试通过添加索引将扫描变成搜索;寻找估计行数和实际行数之间的巨大差异——这表明统计数据已经过时;看看“执行次数”——我怀疑这些函数执行了很多次。