【发布时间】: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