Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我们可以在Oracle11中的表列上创建位图索引吗?该表列每天使用作业重新加载_Database_Oracle_Bitmap Index - Fatal编程技术网

Database 我们可以在Oracle11中的表列上创建位图索引吗?该表列每天使用作业重新加载

Database 我们可以在Oracle11中的表列上创建位图索引吗?该表列每天使用作业重新加载,database,oracle,bitmap-index,Database,Oracle,Bitmap Index,我们有一个表,它存储了有关客户机的信息,这些客户机是通过每天从数据仓库中使用计划作业加载的。该表中有100多万条记录。 我想在Country列上定义位图索引,因为值的数量有限。 如果我们每天删除数据并将其重新加载到表中,会对索引产生任何影响吗。我们是否需要在每次加载后显式重建索引当表频繁更新(索引列)时,位图索引是危险的,因为单行上的DML可以锁定表中的多行。这就是为什么它更像是数据仓库工具而不是OLTP。位图索引的真正威力还在于使用逻辑操作将更多的位图索引组合起来,并将结果转换为行ID(然后访

我们有一个表,它存储了有关客户机的信息,这些客户机是通过每天从数据仓库中使用计划作业加载的。该表中有100多万条记录。 我想在Country列上定义位图索引,因为值的数量有限。
如果我们每天删除数据并将其重新加载到表中,会对索引产生任何影响吗。我们是否需要在每次加载后显式重建索引当表频繁更新(索引列)时,位图索引是危险的,因为单行上的DML可以锁定表中的多行。这就是为什么它更像是数据仓库工具而不是OLTP。位图索引的真正威力还在于使用逻辑操作将更多的位图索引组合起来,并将结果转换为行ID(然后访问行或聚合行)。在Oracle中,通常没有太多理由重建索引。经常修改时,它将始终通过50/50块分割进行调整。试图将其压缩到尽可能小的空间是没有意义的。除非每行都包含大量数据,否则今天的一百万行算不了什么


还要注意位图索引需要Enterprise edition许可证。

定义位图索引的理由不是列中的几个值,而是一个可以从访问表行中获益的查询

例如,如果您假设4个国家人口相等,Oracle将不使用索引,因为完整表扫描更便宜

若你们有一些“异国情调”的国家(很少有记录),位图索引可以使用,但你们很可能发现和传统索引并没有什么不同

我想在Country列上定义位图索引,因为值的数量有限

仅仅因为列的基数较低,并不意味着它是位图索引的候选。可能是,也可能不是

汤姆·凯特的解释很好

位图索引在您需要的环境中非常有用 许多特别的查询,特别是引用许多列的查询 以特别的方式或生成聚合,如COUNT。对于 例如,假设您有一个包含三列的大表:GENDER, 地点、年龄组。在此表中,性别的值为M或F, 位置可以采用1到50的值,年龄组是一个代码 代表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*树索引

  • 性别、位置、年龄组:适用于使用所有三者的查询,或带有 地点,还是性别
  • 位置、年龄组:用于使用位置和年龄组或位置的查询 独自一人
  • 年龄组,性别:用于将年龄组与性别或年龄组一起使用的查询 独自一人

在大多数情况下,表上只有一个位图索引是没有用的。当您在一个表上创建了多个位图索引,并且您的查询将它们组合在一起时,您将获得位图索引的好处

也许a更适合你的情况