2009-11-05 91 views
2

我遇到了我正在执行的select语句的性能问题。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. 

我的发言是含有约20-25数据的场共18行返回。返回一个字段或全部都没有区别。这种表现是典型的吗?我能做些什么来改善它吗?

我试过使用子选择检索外键,IN子句和我发现一个帖子,其中一个家伙说使用左外连接帮助他。对我来说,他们都会产生相同的5到10秒的执行时间。

这是通过MS SQL管理工作室访问的MS SQL Server 2005。时间是查询分析器中经过的时间。

任何想法?

+0

什么是索引?你知道如何显示和分析查询计划吗? – gerleim 2009-11-05 23:15:55

回答

2

您应该做的第一件事是analyze the query plan,以查看SQL Server正在使用的索引(如果有)。

您可以在此查询一些covering indexes可能受益,因为你只用列LineinfoOrder_Header的加入和查询的限制(WHERE子句)。

1

我没有在你的查询中看到任何特殊的东西,所以如果索引是正确的,它应该比这更快地执行,行数不是很高。

是否在查询中涉及的表上有索引,并且您是否尝试使用查询分析器的“显示执行计划”选项。基本上,您需要运行查询,在执行计划中循环并添加索引,以便您看不到任何全表扫描操作。

如果您从SQL Management Studio运行,那么您可以选择自动调整添加索引的查询,但我会建议您自己尝试优化以更好地理解您正在执行的操作。

问候 马西莫

1

这不会影响性能,但不写一个查询,如“SELECT * FROM X”。避开星号并拼出各个栏目。即使通过添加列来更改模式,调用此代码的代码仍然可以这样工作。

其他人已经说过,索引是关键。

WHERE子句的顺序可以提供帮助。首先执行消除最多行数的那个。

1

把所有的建议和滚动到一起我能够设置一些索引,现在它只需要不到一秒的时间执行。老实说,这几乎是直接的。

我的问题是,通过点击表格属性,我看到主键被索引,我错误地认为这是每个人都在谈论。我查看了执行计划并运行调优助手并将两者结合在一起,我意识到您也可以对外键进行索引。现在已经完成,事情异常活跃。

感谢您的帮助,并为这样一个新问题感到抱歉。