【问题标题】:Querying Oracle table of high degree of parallelism results in full table scan查询高度并行的Oracle表导致全表扫描
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 也许在关系理论中,但在 Oracle 数据仓库上下文中,“度”一词几乎可以肯定意味着“并行度”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多