我在表T的A,B,C,D列上有一个索引
我有一个查询,它在WHERE子句中使用A,B,C从T中提取.
是否会使用索引或是否需要一个仅包含A,B,C的单独索引?
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中使用数据库引擎优化顾问.它将告诉您表是否未针对要运行的查询进行理想的索引编制.
这取决于!
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
这些不依赖于索引,因为索引没用.
单击"显示估计执行计划"以确认潜在的索引使用情况.
在Oracle数据库中,这称为复合索引(12g文档但对早期版本有效)
复合索引可以加速SELECT语句的数据检索,其中WHERE子句引用复合索引中列的所有前导部分.因此,定义中使用的列的顺序很重要.通常,最常访问的列首先出现.
在你的情况下,是的.该指数将/可以使用.这可以通过使用解释计划来验证.
如果MS SQLSERVER不同(我怀疑它可能),你需要一个新的答案.
编辑: 还应该提到它只会考虑使用索引..这并不一定意味着它会使用它.
Edit2: Oracle 11g及更高版本现在有一个选项,允许它跳过索引中的列.所以对A,B和D的查询可能仍然使用索引