aw *_*rud 5 sql oracle query-hints
突然间(但不幸的是我不知道"突然"是什么时候;我知道它在过去的某个时刻运行正常)我的一个查询开始花费7+秒而不是毫秒来执行.我有一个本地表和3个表通过数据库链接访问.3个远程表连接在一起,其中一个与我的本地表连接在一起.
本地表的where子句只需要几毫秒就可以自己执行,并且只返回一些(最多10个或100个)记录.3个远程表之间有数十万甚至数百万条记录,如果我加入它们,我会获得数十或数十万条记录.
我只加入远程表,以便我可以提取与本地表中每条记录相关的一些数据.
然而,似乎正在发生的事情是,Oracle首先将远程表连接在一起,然后将本地表连接到最后的那个混乱.这总是一个坏主意,特别是考虑到现在存在的数据集,所以我/*+ LEADING(local_tab remote_tab_1) */
在查询中添加了一个提示,它现在以毫秒为单位返回.
我比较了解释计划,它们几乎相同,除了一个BUFFER SORT
远程表上的单个.
我想知道什么可能导致Oracle以错误的方式处理这个问题?这是指数问题吗?我应该寻找什么?
在选择执行计划时,oracle会估算不同计划的成本.该估计的一个关键信息是从执行计划的步骤返回的行数.Oracle尝试使用"统计"来估计那些,即有关表包含多少行的信息,列包含多少个不同的值; 这些值的均匀分布.
这些统计数据只是统计数据,而且可能是错误的,这是对oracle优化器误判的最重要原因之一.
因此,收集评论中描述的新统计数据可能会有所帮助.查看有关该dbms_stats包的文档.调用该包有许多不同的方法.