Oracle11g 如何将低/高基数列配对为复合索引?

Oracle11g 如何将低/高基数列配对为复合索引?,oracle11g,database-performance,Oracle11g,Database Performance,这个问题与Oracle DB有关,所以如果有一般性的答案,我想知道。因为我放弃了Derby/MySQL和其他数据库中关于这个主题的信息 假设我在WHERE子句上使用以下列进行了几个查询: -询问 从T中选择*其中A:=?B:=? 从T中选择*其中A:=?B:=?和C:=? 从T中选择*其中A:=?和C:=? 从T中选择*其中A:=?和C:=?和D:=? 从T中选择*其中A:=?和E:=?和F:=? 将这些列配对并将基数混合作为复合索引是否有任何好处?如果是的话,遵循什么逻辑? 我已经理解了,但这

这个问题与Oracle DB有关,所以如果有一般性的答案,我想知道。因为我放弃了Derby/MySQL和其他数据库中关于这个主题的信息

假设我在WHERE子句上使用以下列进行了几个查询:

-询问 从T中选择*其中A:=?B:=? 从T中选择*其中A:=?B:=?和C:=? 从T中选择*其中A:=?和C:=? 从T中选择*其中A:=?和C:=?和D:=? 从T中选择*其中A:=?和E:=?和F:=? 将这些列配对并将基数混合作为复合索引是否有任何好处?如果是的话,遵循什么逻辑? 我已经理解了,但这是针对SQL Server的,它的行为可能会有所不同

是否值得做覆盖指数而不是单个小型综合指数

复合索引的列顺序是否重要?i、 e:

-无论创建表时的列顺序如何。 在ta,C上创建索引NDX_1; -与: 在tc,A上创建索引NDX_1; 这个索引有用吗? 在TE,F上创建索引NDX_2;-低+低忽略“A”列。
有几件事要记住,这些都是一般性的

通常只能使用索引的前导部分。这么好看 看看你的例子

如果在A,B,C上有一个索引,在A和上有一个谓词 C、 然后,只能使用上的索引。现在有一些案例 可使用索引的非前导部分;你会看到 这在执行计划中是一种跳过扫描操作,但它们是 通常是次优的。所以你可能想要A,C和C,A

如果不投影索引中的列以外的列,则覆盖索引可能很有用

同样,如果列的选择性较低,通常不需要索引。但是,有可能有两个色谱柱各自具有低选择性,但组合使用时具有高选择性。事实上,这是在维度模型中进行位图索引/星形转换的前提

如果多列索引有用,您可能希望将选择性最低的列放在第一位,并启用索引压缩。索引压缩在某些情况下可以节省大量空间,并且CPU开销非常小


最后,在运行SQL语句时,SQL监视器报告将帮助您优化SQL语句。

有几件事需要注意,这些是一般性的

通常只能使用索引的前导部分。这么好看 看看你的例子

如果在A,B,C上有一个索引,在A和上有一个谓词 C、 然后,只能使用上的索引。现在有一些案例 可使用索引的非前导部分;你会看到 这在执行计划中是一种跳过扫描操作,但它们是 通常是次优的。所以你可能想要A,C和C,A

如果不投影索引中的列以外的列,则覆盖索引可能很有用

同样,如果列的选择性较低,通常不需要索引。但是,有可能有两个色谱柱各自具有低选择性,但组合使用时具有高选择性。事实上,这是在维度模型中进行位图索引/星形转换的前提

如果多列索引有用,您可能希望将选择性最低的列放在第一位,并启用索引压缩。索引压缩在某些情况下可以节省大量空间,并且CPU开销非常小


最后,SQL Monitor报告将帮助您在运行SQL语句时优化SQL语句。

最佳处理所有5种情况的最小索引数:

(A, B, C)  -- in exactly this order
(A, C, D)  -- in exactly this order
(A, E, F)  -- in any order
如果添加另一个SELECT,则所有下注都将关闭

什么时候有A,C和C,A

每个都处理仅使用第一列的情况。 前者在A=1且C>5时是最佳的;后者并非如此。Etc注:=与某种范围测试相关。
为表设计索引时,首先写出所有查询。

最佳处理所有5种情况的最小索引数:

(A, B, C)  -- in exactly this order
(A, C, D)  -- in exactly this order
(A, E, F)  -- in any order
如果添加另一个SELECT,则所有下注都将关闭

什么时候有A,C和C,A

每个都处理仅使用第一列的情况。 前者在A=1且C>5时是最佳的;后者并非如此。Etc注:=与某种范围测试相关。
在为表设计索引时,首先写出所有查询。

将两个单独的索引a、C和C、a一起使用是否是一种好的做法?即使两者的基数都很低?谢谢你,罗兹皮。我不太喜欢最佳实践;但我会尽量告诉你这些信息,这样你才能做出明智的决定。原因是很多答案都很简单——这要看情况而定。但是,如果A和C都是低选择性的,我可能不会同时创建两个索引。使用两个单独的索引A、C和C是一种好的做法吗,
A总共?即使两者的基数都很低?谢谢你,罗兹皮。我不太喜欢最佳实践;但我会尽量告诉你这些信息,这样你才能做出明智的决定。原因是很多答案都很简单——这要看情况而定。然而,如果A和C都是低选择性的,我可能不会同时创建这两个索引。