gpt4 book ai didi

oracle - Oracle 执行计划中的访问和过滤谓词

转载 作者:行者123 更新时间:2023-12-03 15:37:40 27 4
gpt4 key购买 nike

Oracle 执行计划中的 Access 和 Filter 谓词有什么区别?
如果我理解正确,“访问”用于确定需要读取哪些数据块,并在读取块后应用“过滤器”。因此,过滤是“邪恶的”。

在下面执行计划的 Predicate Information 部分的示例中:

10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y')
filter("CURRENT_VERSION_IND"='Y')

为什么“CURRENT_VERSION_IND”在“访问”和“过滤器”部分中重复出现?

对应的操作是INDEX RANGE scan on index,定义在字段(DOMAIN_CODE、CODE_VALUE、CURRENT_VERSION_IND、DECODE_DISPLAY)上。

我的猜测是因为 CURRENT_VERSION_IND 不是索引中的第二列,所以 Oracle 在 Access 阶段无法使用它。因此,它通过 DOMAIN_CODE 列访问索引,获取所有块,然后通过 CURRENT_VERSION_IND 过滤它们。我对吗?

最佳答案

不,此示例中的访问谓词表明 DOMAIN_CODE 正在遍历索引。和 CURRENT_VERSION_IND .

我不会担心看起来多余的过滤器谓词 - 它似乎是解释计划的一个怪癖,可能与它必须对索引进行某种跳过扫描的事实有关(它执行范围扫描第一列,然后跳过扫描 CODE_VALUE ,搜索任何匹配的 CURRENT_VERSION_IND s)。

是否需要修改索引或创建另一个索引完全是另一回事。

另外,只是为了纠正一个小误解:必须从索引中获取块,然后才能执行任何操作,无论是执行“访问”还是“过滤”步骤。如果您指的是从表中获取块,那么答案是否定的 - 您说过滤谓词“10”是针对索引访问,而不是针对表访问;无论如何,Oracle 没有理由不能评估 CURRENT_VERSION_IND 上的过滤器。在索引上 - 它根本不需要访问表,除非它需要索引中未包含的其他列。

关于oracle - Oracle 执行计划中的访问和过滤谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1464469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com