我正在执行的select语句出现了性能问题。
这就是它:
SELECT Material.*
FROM Material
INNER JOIN LineInfo ON Material.LineInfoCtr = LineInfo.ctr
INNER JOIN Order_Header ON LineInfo.Order_HeaderCtr = Order_Header.ctr
WHERE (Order_Header.jobNum = 'ttest')
AND (Order_Header.revision_number = 0)
AND (LineInfo.lineNum = 46)根据服务器负载的不同,该语句的执行时间为5-10秒。
一些表统计信息:
- Material has 2,030,xxx records.
- Lineinfo has 190,xxx records
- Order_Header has 2,5xx records.我的语句总共返回18行,包含大约20-25个数据字段。返回单个字段或返回所有字段都没有区别。这是典型的性能吗?我能做些什么来改进它吗?
我试着使用sub select来检索外键,IN子句,我发现了一个帖子,一个家伙说使用left outer join帮助了他。对我来说,它们都产生相同的5到10秒的执行时间。
这是通过MS SQL management studio访问的MS SQL server 2005。时间是查询分析器中经过的时间。
有什么想法吗?
发布于 2009-11-06 07:13:44
您应该做的第一件事是analyze the query plan,以查看SQL Server正在使用什么索引(如果有的话)。
在这个查询中,您可能会从一些covering indexes中受益,因为您只将Lineinfo和Order_Header中的列用于连接和查询限制( WHERE子句)。
发布于 2009-11-06 07:14:54
我在您的查询中看不到任何特殊之处,因此,如果索引是正确的,那么它的执行速度应该比这快得多,行数不是很高。
在查询中涉及的表上是否有索引,以及是否尝试使用查询分析器的“显示执行计划”选项。基本上,您需要运行查询,在执行计划中循环,并添加索引,以便看不到任何全表扫描操作。
如果您从SQL Management studio运行,那么您可以选择自动调优查询,添加索引,但我建议您尝试自己优化,以便更好地理解您正在做什么。
问候马西莫
发布于 2009-11-06 07:47:47
它不会影响性能,但不要编写像"SELECT * FROM X“这样的查询。避免使用星号符号,并拼写出各个列。调用此方法的代码仍将以这种方式工作,即使通过添加列更改了架构。
索引是这里的关键,正如其他人已经说过的那样。
WHERE子句的顺序可能会有所帮助。首先执行消除考虑的最大行数的那一个。
https://stackoverflow.com/questions/1684288
复制相似问题