查询高度并行的Oracle表会导致全表扫描

时间:2011-08-22 09:54:41

标签: sql performance oracle parallel-processing

好吧,标题描述了我最近在Oracle数据库中遇到的问题。

以下是一些背景知识:

  • 关注表中的哈希分区为4个分区。
  • 表的平行度为4.
  • 哈希键等于PK。
  • 表格中有很多行,大约200M。
  • PK索引也是分区的(本地分区)。
  • 指数的平行度为1.

好的,现在我的查询行为很奇怪,因为我改变了表的并行度。

如果表程度为4,则会导致全表扫描(协调并行全表扫描),如解释计划所示。需要30分钟或更长时间才能完成查询。

如果表度为1-3,则正确使用PK索引(范围扫描,单线程)并在20秒内返回结果。

如果我将表度和索引度都设置为4,则会产生全表扫描(与上面第一个场景的结果相同)。

然而,这种行为不会发生在我拥有几乎相同的表克隆的另一个数据库中。唯一的区别是记录数量。另一个数据库中的表格略小(减去1-2百万)。较小的表(也是度数为4)不会使用相同的查询进入全表扫描。

我花了一些时间在Googling上找到了关于并行查询的以下内容:

来自Oracle官方文档

  

表的高度并行性会使优化程序在范围扫描中偏向全表扫描。检查ALL_TABLES中的DEGREE列以确定表的并行度。

来自http://www.toadworld.com/Portals/0/GuyH/Articles/Oracle%20Parallel%20SQL%20Part%201.pdf

时应该应用并行查询
  

SQL至少执行一次完整的表,索引或分区扫描

来自AskTom.com

  

并行查询适用于某类大问题:非常大的问题   没有其他解决方案。并行查询是我解决问题的最后一步   性能问题;这绝不是我的第一个行动方案。

似乎并行执行是为了在没有其他更好的解决方案时处理大量数据而设计的。它试图通过并行运行来提供更好的性能,每个CPU(进程)专用于处理分离的数据部分(块范围,表分区或索引分区)。这样它并不是为了加速一般查询或查询不能覆盖整个表的足够部分。

我的上述理解是否正确,不应将并行用作加速一般查询的手段?

如果是,那是否也意味着关闭并行(度数为0)并通过提示或并行子句启用特定查询/操作的最佳做​​法?

除此之外,设置PARALLEL的最佳做法是什么?如果我想做的是通过多线程提供最佳的读取性能,那么设置应该是什么?

这里有很多问题。非常感谢。

3 个答案:

答案 0 :(得分:0)

作为一般规则,我同意汤姆的观点。我们的主基表是一个大约240米的行iot,加上其他索引,每天24小时发生10到1,000次插入,删除,更新操作。我们通常会在几秒钟内从中获取信息,然后如果我们需要大量信息进行全面扫描并处理2.5小时。在回答您的一些问题时,如果您要做的是大型查询而不是小型查询,那么请使用分区。如果没有,那就不要。

答案 1 :(得分:0)

对于您的特定查询,并行性可能不是您最大的问题。查询的新估计成本和时间将非常大致等于原始成本除以并行度。优化器在这里可能是错误的;例如,如果您只有一个硬盘驱动器,那么新计划可能根本不会更快。但是4倍估计错误不应该导致90倍的性能差异。这让我相信你的计划已经处于失败的边缘,而这只是让它结束了。您的非平行计划的估计和实际基数有多接近?无论导致这些差异的是什么,都可能导致您的大部分问题。

对于更一般的问题,没有简单的答案。对于并行性,您可能需要考虑几十件事情,只有您可以知道哪些事情适用于您的情况。您最好的选择是停止尝试谷歌,而是阅读手册。数据仓库指南中的Using Parallel Execution章节是一个很好的起点。

答案 2 :(得分:-2)

SQL中的关系或表的级别表示关系中的属性数。 例如:如果SQL中的关系有三行四列,那么它的度数为四。简单地说,我们可以说关系的列数称为度。