【问题标题】:Select statement performance选择语句性能
【发布时间】:2010-12-13 15:31:17
【问题描述】:

我正在执行的选择语句出现性能问题。

这里是:

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 子句,我发现一个帖子,其中一个家伙说使用左外连接帮助了他。对我来说,它们都产生相同的 5 到 10 秒的执行时间。

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

有什么想法吗?

【问题讨论】:

  • 索引是什么?您知道如何显示和分析查询计划吗?

标签: sql-server select join


【解决方案1】:

接受所有建议并将它们汇总在一起,我能够设置一些索引,现在执行时间不到一秒钟。老实说,这几乎是立竿见影的。

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

感谢您的帮助,对于这样一个新手问题,我们深表歉意。

【讨论】:

    【解决方案2】:

    不会影响性能,但不要写“SELECT * FROM X”之类的查询。避开星号符号并拼出各个列。调用它的代码仍然会以这种方式工作,即使通过添加列来更改架构。

    索引是这里的关键,正如其他人已经说过的那样。

    WHERE 子句的顺序会有所帮助。首先执行从考虑中排除最多行数的那个。

    【讨论】:

      【解决方案3】:

      我在您的查询中没有看到任何特别之处,因此,如果索引正确,它的执行速度应该比这快得多,行数不是很高。

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

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

      问候 马西莫

      【讨论】:

        【解决方案4】:

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

        您可能会从该查询中的一些covering indexes 中受益,因为您仅将LineinfoOrder_Header 中的列用于连接和查询限制(WHERE 子句)。

        【讨论】:

          猜你喜欢
          • 2012-05-16
          • 1970-01-01
          • 2010-10-03
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 2013-06-22
          相关资源
          最近更新 更多