当前位置:  开发笔记 > 数据库 > 正文

如果不使用所有列,我的索引会被使用吗?

如何解决《如果不使用所有列,我的索引会被使用吗?》经验,为你挑选了3个好方法。

我在表T的A,B,C,D列上有一个索引

我有一个查询,它在WHERE子句中使用A,B,C从T中提取.

是否会使用索引或是否需要一个仅包含A,B,C的单独索引?



1> Kevin Crumle..:

David B是正确的,您应该检查执行计划以验证索引是否正在使用.

是否会使用索引或是否需要一个仅包含A,B,C的单独索引?

要回答问题的最后一部分,我认为这是核心的基础主题(而不是直接的解决方案),几乎没有理由索引索引列的子集.如果您的索引是(A,B,C,D),WHERE对(A,B,C)最有可能导致索引搜索,这是理想的情况 - 索引包含引擎需要的所有信息直接进入结果集.我相信这对数字类型和字符串类型中的相等测试都适用,尽管它可以与LIKE'%'分解.另一方面,如果您的WHERE仅引用了D,则很可能最终会进行索引扫描,这意味着SQL引擎必须扫描A,B和C的所有组合,然后在决定是否将行添加到结果集之前检查D是否符合您的条件.在一个特别大的表上,当我发现自己不得不对列"D"进行大量查询时,我只为D添加了一个附加索引,并且看到了大约90%的性能提升.

编辑:我还应该建议在SQL Management Studio中使用数据库引擎优化顾问.它将告诉您表是否未针对要运行的查询进行理想的索引编制.



2> Amy B..:

这取决于!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

这些不依赖于索引,因为索引没用.

单击"显示估计执行计划"以确认潜在的索引使用情况.



3> ShoeLace..:

在Oracle数据库中,这称为复合索引(12g文档但对早期版本有效)

复合索引可以加速SELECT语句的数据检索,其中WHERE子句引用复合索引中列的所有前导部分.因此,定义中使用的列的顺序很重要.通常,最常访问的列首先出现.

在你的情况下,是的.该指数将/可以使用.这可以通过使用解释计划来验证.

如果MS SQLSERVER不同(我怀疑它可能),你需要一个新的答案.

编辑: 还应该提到它只会考虑使用索引..这并不一定意味着它会使用它.

Edit2: Oracle 11g及更高版本现在有一个选项,允许它跳过索引中的列.所以对A,B和D的查询可能仍然使用索引

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有