基于Oracle函数的位图索引
我使用的是Oracle 11g,我有三个表,即基于Oracle函数的位图索引,oracle,indexing,oracle11g,bitmap-index,Oracle,Indexing,Oracle11g,Bitmap Index,我使用的是Oracle 11g,我有三个表,即表1,表2,表3。在select语句中,我需要执行以下查询: SELECT -- // ommitted FROM TABLE_1, TABLE_2, TABLE_3 WHERE -- // ommitted AND NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0) AND (TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE
表1
,表2
,表3
。在select语句中,我需要执行以下查询:
SELECT
-- // ommitted
FROM
TABLE_1,
TABLE_2,
TABLE_3
WHERE
-- // ommitted
AND NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
AND (TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE_1.COL_2, 0) = 0)
我想为以下内容创建基于函数的位图索引:
NVL(表1.COL\u 1,0)=NVL(表2.COL,0)
(TABLE_1.COL_2=TABLE_3.COL或NVL(TABLE_1.COL_2,0)=0)
NVL(表1.COL\u 1,0)=NVL(表2.COL,0)
我尝试过:
CREATE BITMAP INDEX TABLE_1_TABLE_2_NVL_COL_IDX
ON TABLE_1 (TABLE_2.COL)
FROM TABLE_1, TABLE_2
WHERE NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0);
但它抛出了一个错误:
如果我能够创建索引,那么以下语法是否是在select语句中提供提示的正确方法
SELECT
/*+ INDEX (TABLE_1 TABLE_1_TABLE_2_NVL_COL_IDX) */
/*+ INDEX (TABLE_1 TABLE_1_TABLE_3_NVL_COL_IDX) */
-- // ommitted
位图连接索引受限制。即:
- 无法创建基于函数的联接索引
- 维度表列必须是主键列或具有唯一约束
表2.col
上添加主约束或唯一约束。这也意味着此列中不应有空值
因此,您将需要一种不同的方法来对此查询进行索引。连接谓词
NVL(TABLE_1.COL_1,0)=NVL(TABLE_2.COL,0)
创建表_1中所有列在COL_1中为null,表_2中所有行在COL中为null的笛卡尔乘积。如果有1000行在每个表中为null值,笛卡尔乘积将有1000000行。这真的是你想要的吗?@Codo,当在where子句中使用这个谓词时,TABLE_1
和TABLE_2
的其他列上有过滤器,所以我想说笛卡尔积不会太大。但是如果我能够创建这样一个索引,那么这个索引确实会很大。你认为这样的指数是不现实的,弊大于利吗?
SELECT
/*+ INDEX (TABLE_1 TABLE_1_TABLE_2_NVL_COL_IDX) */
/*+ INDEX (TABLE_1 TABLE_1_TABLE_3_NVL_COL_IDX) */
-- // ommitted