gpt4 book ai didi

sql - Oracle SQL 何时使用完整提示

转载 作者:行者123 更新时间:2023-12-02 00:03:15 25 4
gpt4 key购买 nike

我明白完整提示:

/*+ FULL(alias) */

将强制优化器执行全表扫描。

除了查询选择表中大部分行的明显情况之外,是否有任何情况比使用索引更有用?

最佳答案

非常广泛的话题。

来自 Oracle 文档 “使用提示时,在某些情况下,您可能需要指定完整的提示集以确保最佳执行计划。例如,如果您有一个非常复杂的查询,它包括许多表连接,如果你只为给定的表指定 INDEX 提示,那么优化器需要确定要使用的剩余访问路径,以及相应的连接方法。因此,即使你给出了 INDEX 提示,优化器可能不一定使用该提示,因为优化器可能已确定由于优化器选择的连接方法和访问路径而无法使用请求的索引。”

它避免使用索引并使用 FTS。

这有异常(exception),就像所有一般概念一样。全表扫描可能比索引扫描然后通过 rowid 访问表更便宜 - 有时要便宜得多。

摘录 from :

除了表 block 之外,索引 block 也需要被读取。如果索引很大(占表大小的相当大的百分比),SGA(和关联锁存器)的压力可能会很明显如果索引的排序顺序与数据在实际表中的存储方式不匹配,则完成查询所需的逻辑 I/O 数量可能(可能很多)多于执行完整查询所需的 LIO 数量表扫描。 (该指数的聚类因子是您可以用来估计这一点的指标之一。)

从本质上讲,如果通过索引进行扫描会使数据 block I/O 请求在整个表中跳跃,则总体成本将高于执行大型顺序读取的成本。 FTS 更有可能使用多 block 直接路径读取,完全绕过 SGA,这也可能是好的 - 没有“缓存抖动”,更少的闩锁。

如果你有一个覆盖索引,它很可能会一直击败全表扫描。如果不是,这将取决于需要处理的实际 block (数据+索引)的百分比(索引对该查询的选择性),以及它们相对于彼此“物理排序”的程度。

至于为什么优化器在这里为您选择“错误”路径:很难说。索引或表上的陈旧统计信息可能像往常一样成为一个问题,基于 LIKE 计算的估计可能会因某些模式而关闭,实例参数可能过于偏向于索引,......如果这是唯一行为不端的查询,并且您的统计数据是最新的,使用/*+ 完整 */提示听起来还不错。

另请阅读 Stack documentation

关于sql - Oracle SQL 何时使用完整提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068474/

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