Database design 按值差异索引中多列的顺序

Database design 按值差异索引中多列的顺序,database-design,indexing,Database Design,Indexing,示例: 表A包含Person和DateTime字段。我想查询一个人在某个日期后的数据。有1000万行,有1000个不同的人,日期时间在一年内平均分布 问题: 在处理与示例类似的情况时,我在采取措施并观察sybase sql数据库上的执行计划后得出以下结论。我在互联网上找不到关于他的好信息。你会把下面的陈述看作是一个一般的真实规则,或者它取决于……以及什么? 如果有不同的列具有或多或少不同的值,并且我们使用使用索引中的所有列(带sense)的语句读取数据,那么读取性能最好: 如果索引只有一个字段

示例:

表A包含Person和DateTime字段。我想查询一个人在某个日期后的数据。有1000万行,有1000个不同的人,日期时间在一年内平均分布

问题:

在处理与示例类似的情况时,我在采取措施并观察sybase sql数据库上的执行计划后得出以下结论。我在互联网上找不到关于他的好信息。你会把下面的陈述看作是一个一般的真实规则,或者它取决于……以及什么? 如果有不同的列具有或多或少不同的值,并且我们使用使用索引中的所有列(带sense)的语句读取数据,那么读取性能最好:

  • 如果索引只有一个字段,则选择具有最多不同值的列
  • 如果索引有多个字段,则按从差异最小到差异最大的顺序选择列
当我想象一个索引组织树中的指针时,每个节点都有两个后代,那么上面的语句对我来说似乎是合乎逻辑的,不是吗?我也会对索引结构是如何构建、使用的链接感兴趣,或者对引擎使用哪种类型的知识感兴趣,因为我觉得这对上面的陈述有影响……还是没有?谢谢

(虽然我不熟悉Sybase,但我想我可以提供一些关于索引的一般性说明…)

表A包含Person和DateTime字段。我想查询一个人在某个日期后的数据。有1000万行,有1000个不同的人,日期时间在一年内平均分布

看起来你只需要一个索引,在它的最前端有日期/时间

如果索引只有一个字段,则选择具有最多不同值的列

如果可以选择,则不必只选择一列—如果合适,则选择多列。例如,复合索引可以满足AND条件,但OR需要单独的索引

如果索引有多个字段,则按从差异最小到差异最大的顺序选择列

复合索引中字段的顺序主要受该索引应该服务的查询类型的影响。例如,如果需要提供这两个查询:

SELECT * FROM T WHERE C1 = 'foo' AND C2 = 'bar'
SELECT * FROM T WHERE C1 = 'foo'
…那么,在{C1,C2}上只创建一个索引比在{C2,C1}和{C1}上创建两个索引要好得多,即使C2具有更好的选择性1

传统观点认为,在综合指数中,选择性更好的色谱柱应该排在第一位,但不应盲目遵循这一规则。例如,Oracle可以压缩索引前缘,在这种情况下,选择性较低的列实际上应该排在第一位。即使没有索引压缩,您也可能希望将数据保存在选择性较低的列上,如果这更符合您的查询模式的话

索引是一个复杂的平衡行为,我强烈建议阅读以更彻底地处理这个主题



1索引中不同键值的数量与索引行的数量之间的比率。我想这就是你所说的“多样性”的意思。

谢谢你回答这个问题。我知道“传统智慧”。当我在这个具体案例中的测试出现时,我开始重新思考和思考,第一列选择较少的索引(不记得那个词)的执行速度快了80倍左右。这就是为什么我对内部结构和/或不同的索引“类型/结构”更感兴趣的原因。我将使用的聚集索引。你有没有其他的提示或理由来解释为什么选择较少的专栏会更好?oracle示例的目标是平衡索引大小和快速访问,不是吗关于对或查询使用单列索引。一个查询只能使用一个索引。如果真的有必要使用or,我会遇到这样的情况:最好使用UNION和仅使用and术语的不同查询。我相信你已经意识到了这一点,但上面这句话表达得并不好。@DiegoFrehner我怀疑你仅仅从选择性上就得到了80倍的差异。在这种情况下,列的顺序实际上可能很重要。Oracle示例以索引大小(因此缓存和因此速度)为目标。@ DiegoFrehner for for或:从t中考虑<代码>选择*,其中c1=“fo”或c2=“bar”< /代码> -您需要对{C1}和{C2}(不在{C1,C2}上的复合索引)单独的索引以进行最佳执行。UNION只是表示同一查询的另一种方式,任何值得使用的DBMS都会为表示相同内容的查询生成相同的执行计划,即使它们在语法上不同。我不是要使用复合索引。但两个查询使每个查询都能够使用其特定的单列索引并合并结果。我同意dbms应该自己生成最好的计划,或者只使用一个索引,或者不使用索引,并在全表扫描中过滤第二个项,或者如果正确地认为它值得,则生成union本身。0.25s到0.003s之间的80倍差异似乎很大,但这是执行paln分析器告诉我的。根据选择的筛选日期,它使用或未使用任何索引。