2011-08-22 109 views
3

那么,标题描述了我最近刚刚遇到的Oracle数据库。查询高度并行性的Oracle表导致全表扫描

这里的一些背景:

  • 表中关注的划分由散到4个分区。
  • 并行度为4.
  • 散列键等于PK。
  • 表中有很多行,大约200M。
  • PK索引也被分区(本地分区)。
  • 索引的并行度为1

好了,现在我已经有了一个查询行为异常,我更改表的并行度。

如果表度数为4,则按解释计划的结果显示全表扫描(协调并行全表扫描)。花30分钟或更多时间完成查询。

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

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

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

我花了一些时间在谷歌上搜索了一圈,发现有关并行查询以下的事情:

从甲骨文官方文档

为表高度并行的歪斜向全表优化扫描范围扫描。检查ALL_TABLES中的DEGREE列以确定并行度。

而且从http://www.toadworld.com/Portals/0/GuyH/Articles/Oracle%20Parallel%20SQL%20Part%201.pdf 并行查询时

的SQL执行应当施加至少一个完整的表,索引或分区扫描

而且从AskTom.com

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

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

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

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

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

很多问题在这里。非常感谢提前。

+2

另请注意,并行操作将消耗大量**资源,因此仅适用于单个大批量作业(并且在大多数多用户环境中不建议) –

回答

0

作为一般规则,我同意汤姆。我们的主要基础表是一个大约240m行iot,加上其他索引,每天24小时有10到1,000个插入,删除和更新操作。我们通常会在瞬间获得信息,然后如果我们想要大量信息进行全面扫描并处理所需的2.5小时。在回答你的一些问题时,如果你打算做比小分类更大的查询,那就去分区吧。如果没有,那就不要。

0

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

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

-2

SQL中关系或表的等级意味着关系中属性的编号。 例如:如果SQL中的关系有三行四列,那么其度数为四。简单地说,我们可以说一个关系的列数称为程度。

+1

也许在关系理论中,但在Oracle数据中仓库环境中,“度”这个词几乎肯定意味着“并行度”。 –