【问题标题】:SQL Server Index questionSQL Server 索引问题
【发布时间】:2010-11-29 05:38:52
【问题描述】:

我有一个在 SQL Server 2005 中连接 3 个表的查询,但没有 Where 子句,所以我正在索引连接语句中找到的字段。

如果我的索引设置为 Col1,col2,col3

我的加入是

Tbl1
inner join tbl2
On
Tbl1.col3=tbl2.col3
Tbl1.col2=Tbl2.col2
Tbl1.col1=Tbl2.col1

与索引的顺序相比,连接语句的顺序是否有所不同?我应该将我的索引设置为 Col3、col2、col1 吗?或者将我的加入语句重新排列为 Col1,col2,col3?

谢谢

【问题讨论】:

  • 您指的是 3 个表,但只有 2 个被连接。而且你也没有说你是否在两个表上都有索引。我想说提供的信息不足以正确回答问题。
  • 对我的假设有任何接受者,即首先拥有最具选择性的列可以帮助优化器?越想越觉得有意义……

标签: sql sql-server tsql indexing performance


【解决方案1】:

SQL Server 查询优化器应该可以解决这个问题。您给出的示例无需更改。

这是一个简单的答案,它取决于您选择的列以及连接 3 个表的方式。

注意:我个人更喜欢更改 JOIN 以匹配“自然”顺序。也就是说,我尝试以与我的键和/或索引匹配的相同顺序(JOIN,WHERE)使用我的列。正如 Joel 所说,它可以帮助以后进行故障排除。

【讨论】:

  • +1 - 更改顺序应该不会有什么不同,但是如果索引顺序发生了变化,而现在您不知道查询速度慢的原因,它可以帮助您稍后发现错误代码.
  • @Joel:谢谢。这就是我想要表达的。
【解决方案2】:

出于查询目的,没关系。您可以根据以下情况考虑替代排序顺序:

  • 可能将索引用于其他查询(包括一些带有 ORDER BY .. 这些列之一的查询)
  • 限制索引碎片(通过使用倾向于将记录添加到表末尾和/或附近的非选择性参数的命令)

编辑:再想一想,首先拥有最具选择性的列可能有助于优化器,例如通过为其提供更好的估计行产量等等......但是这个重要的问题可能已经跑题了,因为 OP 的问题是连接条件的顺序是否重要。

【讨论】:

    【解决方案3】:

    如果你总是在 Col1-3 上有一个连接,那么你应该构建索引,以便“最独特的列”在第一个字段中,而最通用的列在最后一个字段中

    因此“状态正常”/“状态被拒绝”字段应该是字段 3,而 SSN 或电话号码应该是索引上的字段 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多