Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
基于Oracle函数的位图索引_Oracle_Indexing_Oracle11g_Bitmap Index - Fatal编程技术网

基于Oracle函数的位图索引

基于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

我使用的是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.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

位图连接索引受限制。即:

  • 无法创建基于函数的联接索引

  • 维度表列必须是主键列或具有唯一约束

第一个排除了索引中有nvl(col,0)的可能性

第二个解释了你所得到的错误。您需要在
表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