Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Oracle12c_Hint - Fatal编程技术网

尽管有提示,Oracle不使用不可见索引

尽管有提示,Oracle不使用不可见索引,oracle,indexing,oracle12c,hint,Oracle,Indexing,Oracle12c,Hint,我似乎弄乱了索引提示语法,但我已经尝试了我能想到的所有模式/表/索引组合 表和索引与SYS用户不同,SYS用户是我测试索引提示的用户 这是没有提示的语句 select id from car.event where dat < sysdate and type != 0 因此,对于这五条语句,我查找了五个不同的sql\u ID,并查看了如下执行计划 select * from table(dbms_xplan.display_awr([sql_id])); 但它们都没有显示索引的用法。

我似乎弄乱了索引提示语法,但我已经尝试了我能想到的所有模式/表/索引组合

表和索引与SYS用户不同,SYS用户是我测试索引提示的用户

这是没有提示的语句

select id from car.event where dat < sysdate and type != 0
因此,对于这五条语句,我查找了五个不同的sql\u ID,并查看了如下执行计划

select * from table(dbms_xplan.display_awr([sql_id]));
但它们都没有显示索引的用法。他们都使用20的DoP。我是否必须明确禁用索引使用的并行性?或者有人能纠正我的索引提示的语法吗

这是dat_类型索引的定义


编辑:索引设置为不可见,因此其他语句不能使用该索引,但我希望在索引提示中显式使用它。根据我的理解,对于索引提示来说,不可见性不应该是一个问题。如果我错了,请更正。

您忘记在示例中选择ID列。必须指定架构名称和索引,而不使用架构点

你可以做:

select /*+ index(car dat_type) */ id from car.event where dat < sysdate and type != 0


这并不总是强制索引,但是正确的语法是一个好的开始。有时基于成本的优化器CBO很顽固…

我没有真正使用不可见索引,但我阅读文档表明,仅凭提示无法使用它们。必须在系统或会话级别使用初始化参数:

不可见索引是优化器忽略的索引,除非 您可以显式设置优化器\u使用\u不可见\u索引初始化 在会话或系统级别将参数设置为TRUE

根据我对可见索引的测试,提示中的以下任一选项都能正常工作:

/*+ index(event) */
/*+ index(event dat_type) */
可能其他的替代方案也会起作用,但这些是最简单的,而且效果很好。问题不在于索引提示语法;您需要另一个步骤来启用不可见索引的使用

编辑以添加:OP发现,启用不可见索引的另一种方法是使用不可见索引提示。为了只使用提示来实现OP想要的功能,必须同时指定USE_INVISIBLE_INDEX提示和INDEX提示。

我偶然发现,这表明实际上不可能只使用索引提示来使用不可见索引。但是,不可见索引可以与附加的提示USE\u invisible\u索引一起使用

我就是这样让它工作的:

select /*+ use_invisible_indexes index(car dat_type) */ id from car.event where dat < sysdate and type != 0

Oracle查询优化器设置了什么优化器模式?优化器模式设置为“所有行”建议您将问题标题修改为特定的不可见索引,因为这是一个重要因素。@DaveCosta谢谢,我当然在“选择”部分指定了id列。抱歉,这是将声明伪化的错误。我在原来的问题中更正了它。谢谢你对模式点的提示,我现在正在尝试。这与我理解的索引提示语法不匹配。第一个参数应该是表空间,而不是模式名称。我在我的评论中输入了错别字——尽管如此,模式名称本身还不足以指定一个表。Optimizer仍然使用DoP 20,没有indexIt不是我否决了你的答案。我只是对它投了更高的票,因为它为我指出了解决方案。文档中说,对于优化器,不可见的索引被视为可见的普通索引。但我不想那样。我希望不可见索引与我认为可能的索引提示一起使用,但是。。。你为什么认为那是/应该是可能的?我在文件中看不到任何情况。好问题。。我想我在什么地方读过。。但我刚刚发现,我的索引提示和使用不可见索引提示一起作用于不可见索引。不是我否决了你的答案。我只是投了更高的票,因为它为我指出了解决方案。很好的一个——我不知道
select /*+ index(car, dat_type) */ id from car.event where dat < sysdate and type != 0
/*+ index(event) */
/*+ index(event dat_type) */
select /*+ use_invisible_indexes index(car dat_type) */ id from car.event where dat < sysdate and type != 0