我们有一个表格,它存储有关客户端的信息,这些信息每天使用计划作业从数据仓库加载。该表中有超过 100 万条记录。我想在 Country 列上定义 BitMap Index,因为值的数量有限。如果我们每天删除数据并将数据重新加载到表中,是否对索引有任何影响。我们是否需要在每次加载后显式重建索引
4 回答
当表频繁更新(索引列)时,位图索引很危险,因为单行上的 DML 可以锁定表中的许多行。这就是为什么它比 OLTP 更像是数据仓库工具。此外,位图索引的真正强大之处在于使用逻辑操作组合更多索引并将结果转换为 ROWID(然后访问行或聚合它们)。在 Oracle 中,重建索引的理由通常并不多。当频繁修改时,它总是会适应 50/50 块分割。尝试将其压缩到尽可能小的空间是没有意义的。除非每一行都包含大量数据,否则今天一百万行算不了什么。
另请注意,BITMAP 索引需要企业版许可证。
我想在 Country 列上定义 BitMap Index,因为值的数量有限。
仅仅因为一列是低基数并不意味着它是位图索引的候选者。可能是,也可能不是。
汤姆凯特在这里很好的解释。
位图索引在您有大量即席查询的环境中非常有用,尤其是那些以即席方式引用许多列或产生诸如 COUNT 之类的聚合的查询。例如,假设您有一个包含三列的大表:GENDER、LOCATION 和 AGE_GROUP。在此表中,GENDER 的值是 M 或 F,LOCATION 可以取值 1 到 50,AGE_GROUP 是代表 18 岁及以下、19-25、26-30、31-40 和 41 岁及以上的代码。
例如,
您必须支持大量采用以下形式的即席查询:
select count(*)
from T
where gender = 'M'
and location in ( 1, 10, 30 )
and age_group = '41 and over';
select *
from t
where ( ( gender = 'M' and location = 20 )
or ( gender = 'F' and location = 22 ))
and age_group = '18 and under';
select count(*) from t where location in (11,20,30);
select count(*) from t where age_group = '41 and over' and gender = 'F';
您会发现传统的B*Tree
索引方案会让您失望。如果您想使用索引来获得答案,则需要至少三个到六个可能的索引组合B*Tree
才能通过索引访问数据。由于可能会出现三列中的任何一列或三列的任何子集,因此您需要大的串联 B*Tree 索引
- GENDER、LOCATION、AGE_GROUP:适用于同时使用这三个的查询,或 GENDER 与 LOCATION,或单独使用 GENDER
- LOCATION、AGE_GROUP:对于单独使用 LOCATION 和 AGE_GROUP 或 LOCATION 的查询
- AGE_GROUP、GENDER:对于将 AGE_GROUP 与 GENDER 或 AGE_GROUP 单独结合使用的查询
在大多数情况下,表上只有一个位图索引是没有用的。当您在表上创建了多个位图索引并且您的查询将它们组合在一起时,您将获得位图索引的好处。
也许List-Partition更适合您的情况。
定义位图索引的基本原理不是列中的几个值,而是可以从访问表行中受益的查询。
例如,如果您说 4 个国家人口相等,Oracle 将不会使用索引,因为 FULL TABLE SCAN 会更便宜。
如果您有一些“异国情调”的国家(记录很少),可以使用 BITMAP 索引,但您很可能会发现与传统索引没有区别。