paw*_*que 9 index database-agnostic database-theory
哪些数据库使用真正的多维索引?oracle 是否曾经使用多个索引从表中获取数据,还是总是使用似乎具有最高选择性的索引?其他dbms怎么样?
Oracle 有一种称为位图索引的索引类型,它描述为...
一种数据库索引,其中数据库为每个索引键存储位图而不是 rowid 列表。
如果表具有位图索引或使用了提示,则它可以在常规 B 树索引上使用位图访问计划。 位图索引可以连接、联合和交叉。
在use-the-index-luke.com上有一个很好的解释,其中包括以下组合多个 B 树索引的实现:
DB2: DB2 在LUW 9r7(使用动态位图)和zOS v10上支持多索引访问 。
MySQL: 从 5.0 版开始, MySQL 具有索引合并优化。
Oracle Oracle 数据库使用 BITMAP CONVERSION 来动态组合多个索引(在 9i 中引入)。
PostgreSQL PostgreSQL从 8.1 版开始使用位图来组合多个索引。
SQL Server SQL Server从 V7.0 开始可以使用散列算法使用多个索引(“索引相交”)。
另请参阅此 StackOverflow 问题,其中第一个答案说 SQL Server 使用索引交集执行类似于位图索引的操作。
Efficient and Flexible Bitmap Indexing for Complex Similarity Queries是我发现的最接近的参考文献,将位图索引与词多维相关联。多维似乎更像是一种使用索引的方式,而不是它们的属性。
SQL Server 可能会执行索引交集:
SQL Server 优化器具有许多算法和运算符,可以为针对系统运行的查询组合可重用的执行计划。
一种是执行索引交集和/或并集的能力,这基本上意味着它可以使用多个索引对一个表进行查询,并执行交集或并集操作以返回结果集。
能够对一个表使用多个索引允许您创建许多窄索引,优化器可以针对不同的查询计划以不同的方式将这些索引组合在一起。
这反过来又最大限度地减少了对大量专用索引的需求,从而最大限度地减少了索引存储空间和修改影响。
此外,来自Query Tuning Recommendations的文档:
不要在同一个查询中为单个表使用多个别名来模拟索引交叉。这不再是必要的,因为 SQL Server 会自动考虑索引交叉,并且可以在同一个查询中使用同一个表上的多个索引。考虑示例查询:
Run Code Online (Sandbox Code Playgroud)SELECT * FROM lineitem WHERE partkey BETWEEN 17000 AND 17100 AND shipdate BETWEEN '1/1/1994' AND '1/31/1994' ```SQL Server 可以利用 partkey 和 shipdate 列上的索引,然后在两个子集之间执行哈希匹配以获得索引交集。
你是这个意思吗?