突然(但不幸的是,我不知道“突然”是什么时候;我知道它在过去的某个时候运行良好)我的一个查询开始需要 7 多秒而不是毫秒来执行。我有 1 个本地表和 3 个通过 DB 链接访问的表。3 个远程表连接在一起,其中一个与我的本地表连接。
本地表的 where 子句只需要几毫秒即可自行执行,并且只返回几条(最多 10 或 100 条)记录。3 个远程表之间有数十万甚至数百万条记录,如果我适当地加入它们,我会得到数万或数十万条记录。
我只加入远程表,以便我可以提取与本地表中每条记录相关的几条数据。
然而,似乎正在发生的事情是,Oracle 首先将远程表连接在一起,然后将我的本地表连接到最后。这总是一个坏主意,特别是考虑到现在存在的数据集,所以我/*+ LEADING(local_tab remote_tab_1) */
在我的查询中添加了一个提示,它现在以毫秒为单位返回。
我比较了解释计划,它们几乎相同,除了一个BUFFER SORT
远程表上的一个。
我想知道什么可能导致 Oracle 以错误的方式处理这个问题?是索引问题吗?我应该寻找什么?