【发布时间】:2011-11-01 00:32:19
【问题描述】:
嗯,标题描述了我最近在使用 Oracle 数据库时遇到的情况。
这里有一些背景:
- 相关表按哈希分区为 4 个分区。
- 表的平行度为 4。
- 哈希键等于 PK。
- 表格行数不少,200M左右。
- PK 索引也是分区的(本地分区)。
- 索引的平行度为1。
好的,现在当我更改表的并行度时,查询行为异常。
如果 table degree 为 4,它会导致全表扫描(协调并行全表扫描),如解释计划所示。完成查询需要 30 分钟或更长时间。
如果table degree为1-3,则正确使用PK索引(范围扫描,单线程),20秒返回结果。
如果我将 table degree 和 index degree 都设置为 4,则会导致全表扫描(与上面第一个场景的结果相同)。
但是,这种行为不会发生在另一个数据库中,在该数据库中我有一个几乎相同的表克隆。唯一的区别是记录的数量。另一个数据库中的表的大小略小(负 1-2 百万)。较小的表,也具有 4 级,不会使用相同的查询进行全表扫描。
我花了一些时间在谷歌上搜索,发现了以下关于并行查询的事情:
来自Oracle官方文档
表的高度并行性使优化器倾向于全表扫描而不是范围扫描。检查表的 ALL_TABLES 中的 DEGREE 列以确定并行度。
来自http://www.toadworld.com/Portals/0/GuyH/Articles/Oracle%20Parallel%20SQL%20Part%201.pdf 应该应用并行查询
SQL 至少执行一次全表、索引或分区扫描
来自 AskTom.com
并行查询适用于某类大问题:非常大的问题 没有其他解决方案。并行查询是我解决问题的最后一条途径 性能问题;这从来都不是我的第一选择。
似乎并行执行是为在没有其他更好的解决方案存在时处理大量数据而设计的。它试图通过并行运行来提供更好的性能,每个 CPU(进程)专用于处理数据的分离部分(块范围、表分区或索引分区)。这样它就不是为了加快一般查询,或者没有覆盖整个表的足够部分的查询而设计的。
我的上述理解是否正确,即不应将并行用作加速一般查询的手段?
如果是,这是否也意味着关闭并行(度数为 0)并通过提示或并行子句启用特定查询/操作的最佳实践?
除此之外,设置 PARALLEL 的最佳做法应该是什么?如果我想做的是通过多线程提供最佳读取性能,那么设置应该是什么?
这里有很多问题。非常感谢。
【问题讨论】:
-
另请注意,并行操作会消耗大量资源,因此仅适用于单个大批量作业(不建议在大多数多用户环境中使用)
标签: sql performance oracle parallel-processing