gpt4 book ai didi

sql - Oracle LEADING 提示——为什么需要这样做?

转载 作者:行者123 更新时间:2023-12-04 17:05:29 25 4
gpt4 key购买 nike

突然(但不幸的是,我不知道“突然”是什么时候;我知道它在过去的某个时候运行良好)我的一个查询开始需要 7 秒以上而不是毫秒来执行。我有 1 个本地表和 3 个通过数据库链接访问的表。 3 个远程表连接在一起,其中一个与我的本地表连接。

本地表的 where 子句自己执行只需要几毫秒,并且只返回少数(最多 10 条或 100 条)记录。 3 个远程表之间有数十万甚至数百万条记录,如果我适本地加入它们,我会得到数万或数十万条记录。

我只是加入远程表,以便我可以提取与本地表中每条记录相关的几条数据。

然而,似乎正在发生的事情是 Oracle 首先将远程表连接在一起,然后我的本地表最后连接到那个乱七八糟的地方。这总是一个坏主意,特别是考虑到现在存在的数据集,所以我添加了 /*+ LEADING(local_tab remote_tab_1) */提示我的查询,它现在以毫秒为单位返回。

我比较了解释计划,它们几乎相同,除了一个 BUFFER SORT在其中一张远程表上。

我想知道什么可能导致 Oracle 以错误的方式处理这个问题?是索引问题吗?我应该寻找什么?

最佳答案

在选择执行计划时,oracle 会估算不同计划的成本。该估计的一个关键信息是将从执行计划的一个步骤返回的行数。 Oracle 尝试使用“统计”来估计这些数据,即有关表包含多少行、列包含多少不同值的信息;这些值的分布有多均匀。

这些统计只是那个统计,有可能是错误的,这是造成oracle优化器误判的最重要原因之一。

因此,按照评论中的描述收集新的统计数据可能会有所帮助。查看有关该 dbms_stats 包的文档。有许多不同的方法可以调用该包。

关于sql - Oracle LEADING 提示——为什么需要这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321698/

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