Oracle SQL - 无法通过提示删除索引使用情况?
Oracle SQL - Cannot remove index usage by hints?
这是单考的挑战。
要求是使用提示解决它。
我正在尝试完成一个查询,我希望它使用嵌套循环并且没有索引。为此,我写了查询:
select /*+ USE_NL(fulltable) NO_INDEX(fulltable) */ sum(QUANTITY) summarized from
(select /*+ USE_NL(sz1, sz2, c1) NO_INDEX(sz1, sz2, c1) */ distinct *
from SZTABLE sz1
natural join SZTABLE2 sz2
natural join CTABLE c1
where city= 'Newark' and COLOR= 'red') fulltable;
但是,在解释并写出查询后,我得到:
SELECT STATEMENT + +
SORT + AGGREGATE +
VIEW + +
HASH + UNIQUE +
NESTED LOOPS + +
NESTED LOOPS + +
HASH JOIN + +
JOIN FILTER + CREATE + :BF0000
TABLE ACCESS + FULL + CTABLE
VIEW + + VW_DTP_5C333E12
HASH + UNIQUE +
JOIN FILTER + USE + :BF0000
TABLE ACCESS + FULL + SZTABLE
INDEX + UNIQUE SCAN + SZO_SZKOD
TABLE ACCESS + BY INDEX ROWID + SZTABLE2
显然,查询仍然使用索引,尽管我明确要求它不要这样做。我怎样才能解决这个问题?为什么ROWID还有和索引使用?
(计划由下面的代码片段写出。)
SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + '||object_name terv
FROM plan_table
START WITH id = 0 AND statement_id = 'plan1'
CONNECT BY PRIOR id = parent_id AND statement_id = 'plan1'
ORDER SIBLINGS BY position;
您有语法错误。
use_nl 要求多个 table 用空格而不是逗号分隔。
no_index 适用于单个 table。
内部查询请尝试
use_nl(sz1 sz2 c1) no_index(sz1) no_index(sz2) no_index(c1)
您可以删除任何其他内容
奇怪的问题,但您可以获取涉及查询的表上的所有索引并执行此操作:
alter index <Index_Name> unusable
或重写查询
select sum(QUANTITY) summarized from
(select distinct *
from SZTABLE sz1
join SZTABLE2 sz2 on sz1.id+0 = sz2.id+0 --put your join condition, cause I don't know you table columns
join CTABLE c1 on c.id+0 = sz2.id+0 --put your join condition
where city || ''= 'Newark' and COLOR|| ''= 'red') fulltable;
看组合
z1.id+0
city || ''
结果相同,但 CBO 看到 expr 但在索引中找不到它
这是单考的挑战。
要求是使用提示解决它。
我正在尝试完成一个查询,我希望它使用嵌套循环并且没有索引。为此,我写了查询:
select /*+ USE_NL(fulltable) NO_INDEX(fulltable) */ sum(QUANTITY) summarized from
(select /*+ USE_NL(sz1, sz2, c1) NO_INDEX(sz1, sz2, c1) */ distinct *
from SZTABLE sz1
natural join SZTABLE2 sz2
natural join CTABLE c1
where city= 'Newark' and COLOR= 'red') fulltable;
但是,在解释并写出查询后,我得到:
SELECT STATEMENT + +
SORT + AGGREGATE +
VIEW + +
HASH + UNIQUE +
NESTED LOOPS + +
NESTED LOOPS + +
HASH JOIN + +
JOIN FILTER + CREATE + :BF0000
TABLE ACCESS + FULL + CTABLE
VIEW + + VW_DTP_5C333E12
HASH + UNIQUE +
JOIN FILTER + USE + :BF0000
TABLE ACCESS + FULL + SZTABLE
INDEX + UNIQUE SCAN + SZO_SZKOD
TABLE ACCESS + BY INDEX ROWID + SZTABLE2
显然,查询仍然使用索引,尽管我明确要求它不要这样做。我怎样才能解决这个问题?为什么ROWID还有和索引使用?
(计划由下面的代码片段写出。)
SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + '||object_name terv
FROM plan_table
START WITH id = 0 AND statement_id = 'plan1'
CONNECT BY PRIOR id = parent_id AND statement_id = 'plan1'
ORDER SIBLINGS BY position;
您有语法错误。
use_nl 要求多个 table 用空格而不是逗号分隔。
no_index 适用于单个 table。
内部查询请尝试
use_nl(sz1 sz2 c1) no_index(sz1) no_index(sz2) no_index(c1)
您可以删除任何其他内容
奇怪的问题,但您可以获取涉及查询的表上的所有索引并执行此操作:
alter index <Index_Name> unusable
或重写查询
select sum(QUANTITY) summarized from
(select distinct *
from SZTABLE sz1
join SZTABLE2 sz2 on sz1.id+0 = sz2.id+0 --put your join condition, cause I don't know you table columns
join CTABLE c1 on c.id+0 = sz2.id+0 --put your join condition
where city || ''= 'Newark' and COLOR|| ''= 'red') fulltable;
看组合
z1.id+0
city || ''
结果相同,但 CBO 看到 expr 但在索引中找不到它