【问题标题】:how the columns order matters while index creation in sql server?在 sql server 中创建索引时,列的顺序如何?
【发布时间】:2021-08-05 09:32:24
【问题描述】:

我创建了一个表 EMP(名称 varchar(10),地址 varchar(10))和两个列上的两个索引,唯一的区别是列的顺序是变化的。 Index1(name,address) 和 index2(adress,name) 我运行 select * from emp where name='' and address='' 它使用 index2 很明显然后我刷新缓存(甚至重新启动我的 sql 服务)改变顺序为 select * from emp where address='' and name='' an 这次我认为 index1 将被使用,但它使用相同的索引 index2。

现在第二件事-我删除了这个表并重新创建了同一个表,不同之处在于我首先创建了 index2,然后按照上面相同的顺序创建了 index1,并从 case1 执行相同的过程,这次它使用了 index1

问题是 - 在这种情况下,过滤器的顺序是否无关紧要?它总是考虑到最后创建的索引,我的理解是它从右到左读取执行,但这里不是这种情况?

【问题讨论】:

  • 据我所知,列的顺序不应该在索引的使用/创建中发挥作用。您可能需要仔细检查您当前的基准,相对于您使用的数据的大小/类型等。
  • 阅读Cardinality Estimation 和类似主题。所选索引不是基于创建索引的顺序,而是基于可能覆盖查询索引的各个索引的基数。这就是为什么保持索引统计数据相对最新很重要,否则 CE 可能会根据旧数据做出错误的决定。

标签: sql sql-server tsql query-optimization sql-execution-plan


【解决方案1】:

对于您的特定查询,可以使用任一索引。 SQL Server 任意选择其中之一——我不认为其中一个优于另一个。

另一方面,如果您有这样的查询:

where name = ? and address like 'A%'

那么最好的索引是(name, address)

或者像这样:

where address = ? and name like 'A%'

那么最好的索引是(address, name)

WHERE 中的比较顺序与索引使用无关(除非基于优化器中等效索引的顺序存在一些无意义的影响)。

【讨论】:

  • 我认为你在第一个例子中有错字
  • 这是假设name = ?address like 'A%' 更具选择性,因为两个谓词都可以使用索引。
  • @DavidBrowne-Microsoft 。 . .很难想象在这种情况下会使用address(address, name) 上的索引而不是(name, address) 上的索引。也许如果数据库中只有一个名称,优化器会赋予索引相同的权重。
  • @seanb 。 . .我没有看到错字。你指的是什么?
  • 错字是你有相同的索引被列为两个查询的“最佳”。我只是指出索引选择取决于两个谓词的选择性。在其他情况下,“喜欢”谓词可能更具选择性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多