【发布时间】:2014-09-18 22:45:34
【问题描述】:
生产中有一个查询运行了几个小时 (5-6) 小时。我查看了它的执行计划,发现它忽略了一张大桌子上的并行提示。原因 - 它使用索引 ROWID 的表访问。因此,在我在parallel(huge_table) 提示之前添加 /*+ full(huge_table) */ 提示后,查询开始并行运行,不到 3 分钟就完成了。我无法理解的是造成这种巨大性能差异的原因。
以下是我能想到的并行 FTS 的优点:
- 如果您有更多空闲 CPU,并行操作本质上会很快。
- 10g 中的并行操作是绕过的直接 I/O 缓冲区缓存,这意味着没有“缓冲区忙等待”的风险或 缓冲区缓存的任何其他争用。
当然有上面的优点,但是下面的缺点仍然存在:
- 并行操作仍然需要进行 I/O,并且此 I/O 将比我们通过索引 ROWID 访问表所拥有的更多,因为整个表都被扫描并且成本更高(所有物理读取)
- 并行操作的可扩展性不是很好,这意味着如果没有足够的可用资源,它会很慢
有了以上知识,我看到只有一个原因可能导致查询在使用 ACCESS BY INDEX ROWID 时性能不佳 - 某种争用,例如“缓冲区忙等待”。但它没有出现在 AWR 前 5 个等待事件中。前两个事件是“db 文件顺序读取”和“db 文件分散读取”。还有什么我没有考虑到的吗?请赐教。
【问题讨论】:
-
执行计划是否包含操作“BITMAP CONVERSION TO ROWIDS”?
-
@mmdw:不。该计划不包含该操作
标签: sql performance oracle parallel-processing oracle10g