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
为什么oracle忽略暗示的虚拟索引?_Oracle_Indexing_Hint - Fatal编程技术网

为什么oracle忽略暗示的虚拟索引?

为什么oracle忽略暗示的虚拟索引?,oracle,indexing,hint,Oracle,Indexing,Hint,我试图找到优化查询的最佳方法,因此我创建了一个虚拟索引,而不是另一个创建的索引,因此现在我有一个包含所有字段的“真实”索引,还有一个虚拟索引。当我运行执行计划时,它使用的是“真实”的执行计划,因此我避免将其与以下提示一起使用: select /*+INDEX (VIRTUAL_INDEX) */1,2,3,sum(4) ,5 from TABLE group by 1,2,3,5 HAVING SUM(4)>0 select /*+INDEX (TABLE1 INDEX_NA

我试图找到优化查询的最佳方法,因此我创建了一个虚拟索引,而不是另一个创建的索引,因此现在我有一个包含所有字段的“真实”索引,还有一个虚拟索引。当我运行执行计划时,它使用的是“真实”的执行计划,因此我避免将其与以下提示一起使用:

select /*+INDEX (VIRTUAL_INDEX) */1,2,3,sum(4) ,5 
  from TABLE 
 group by 1,2,3,5 
HAVING SUM(4)>0
select /*+INDEX (TABLE1 INDEX_NAME) */ *
  from TABLE1
ALTER SESSION SET "_use_nosegment_indexes" = TRUE;
但是现在它不使用任何索引,执行计划显示一个完整的扫描,而不是指向新的虚拟索引。。。 我对提示或虚拟索引不太了解,所以可能/可能我做错了什么,但我看不出有什么,有人能帮我吗


谢谢。

首先,要让优化器使用索引,您必须编写如下提示:

select /*+INDEX (VIRTUAL_INDEX) */1,2,3,sum(4) ,5 
  from TABLE 
 group by 1,2,3,5 
HAVING SUM(4)>0
select /*+INDEX (TABLE1 INDEX_NAME) */ *
  from TABLE1
ALTER SESSION SET "_use_nosegment_indexes" = TRUE;
其次,试着打开
\u use\u nosegment\u index
参数,如下所示:

select /*+INDEX (VIRTUAL_INDEX) */1,2,3,sum(4) ,5 
  from TABLE 
 group by 1,2,3,5 
HAVING SUM(4)>0
select /*+INDEX (TABLE1 INDEX_NAME) */ *
  from TABLE1
ALTER SESSION SET "_use_nosegment_indexes" = TRUE;
要了解有关虚拟索引的更多信息,请使用


如果我是你,我就不会浪费时间让oracle使用索引,如果oracle不使用它,它就不需要索引。在解析和分析过程中,优化器评估所有可能的行提取方法,并选择成本最低的方法。优化器根据统计信息执行此评估。所以要确保你有新的统计数据

提示可用于虚拟索引。下面是一个演示,首先是一个真实的索引:

SQL> CREATE TABLE test_table (
  2     ID NUMBER PRIMARY KEY,
  3     small_data NUMBER(2) NOT NULL,
  4     other_data NUMBER(3) NOT NULL,
  5     big_data CHAR(1000));
Table created
SQL> INSERT INTO test_table
  2     (SELECT ROWNUM, MOD(ROWNUM, 10), MOD(ROWNUM, 99), 'x'
  3        FROM dual CONNECT BY LEVEL <= 1000);
1000 rows inserted
SQL> CREATE INDEX test_real_idx ON test_table (small_data, other_data);
Index created
SQL> BEGIN
  2     dbms_stats.gather_table_stats(
  3        USER, 'TEST_TABLE',
  4        method_opt => 'FOR ALL INDEXED COLUMNS SIZE 1',
  5        cascade => TRUE);
  6  END;
  7  /
PL/SQL procedure successfully completed
SQL> EXPLAIN PLAN FOR (SELECT small_data, SUM(other_data)
  2                      FROM test_table
  3                     GROUP BY small_data);
Explained
SQL> SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 590429246
--------------------------------------------------------------------------------
| Id  | Operation             | Name          | Rows  | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |               |    10 |    60 |     3  (34)| 00:
|   1 |  HASH GROUP BY        |               |    10 |    60 |     3  (34)| 00:
|   2 |   INDEX FAST FULL SCAN| TEST_REAL_IDX |  1000 |  6000 |     2   (0)| 00:
--------------------------------------------------------------------------------
正如您所看到的,由于提示,虚拟索引优先于真实索引


从您的问题来看,似乎不再使用真正的索引,这可能是这里的主要问题:可能索引不足以回答查询(因为可能?)

我已经完成了您所说的alter会话(我忘了提及),但没有使用表名,现在我已经使用了它,但仍然有完整的扫描…您有表的别名吗?如果您这样做,请将表1替换为您的别名,而不是我正在使用的模式。。。我还尝试了USER.TABLE。