这个标题描述了我最近在Oracle数据库中遇到的情况。
以下是一些背景:
好的,现在我得到了一个奇怪的查询行为,因为我改变了表的并行度。
如果表度为4时,则按“解释计划”所揭示的那样,进行全表扫描(协调并行全表扫描)。完成查询需要30分钟或更长时间。
如果表度为1-3,则正确使用PK索引(范围扫描,单线程)并在20秒内返回结果。
如果将表度和索引度都设置为4,则会得到全表扫描(与上面的第一个场景相同)。
但是,这种行为不会发生在另一个数据库中,在这个数据库中,我有一个几乎相同的表克隆。唯一的区别就是记录的数量。另一个数据库中的表的大小稍微小一些(减去120万)。较小的表,也是级别为4的表,不会以相同的查询进入全表扫描。
我花了一些时间在Googling上搜索并发现了关于并行查询的以下内容:
来自甲骨文官方文件
表的高度并行性使优化器倾向于全表扫描,而不是范围扫描。检查ALL_TABLES中的度数列以确定表的并行度。
而在以下情况下,应该应用http://www.toadworld.com/Portals/0/GuyH/Articles/Oracle%20Parallel%20SQL%20Part%201.pdf并行查询
SQL至少执行一次完整的表、索引或分区扫描。
来自AskTom.com
并行查询适用于某些大问题:没有其他解决方案的非常大的问题。并行查询是解决性能问题的最后一条操作路径;它从来不是我的第一步操作。
当没有其他更好的解决方案时,并行执行似乎是为处理非常大的数据而设计的。它试图通过并行运行来提供更好的性能,每个CPU (进程)都致力于处理数据的分离部分(块范围、表分区或索引分区)。这样,它就不会被设计为加速一般查询,或者不涵盖整个表的足够部分的查询。
我的上述理解是否正确,不应将并行作为加速一般查询的手段?
如果是,这是否也意味着关闭并行(度为0)并通过提示或并行子句启用特定查询/操作的最佳实践?
此外,建立并行的最佳做法应该是什么?如果我要做的是通过多线程提供最佳的读取性能,那么设置应该是什么呢?
这里有很多问题。事先非常感谢。
发布于 2011-08-22 10:14:55
作为一般规则,我同意汤姆的意见。我们的主基表是一个大约240米的行iot,加上其他索引,大约有10到1,000插入、删除、更新操作,每天24小时进行。我们通常会在短时间内从里面得到信息,然后如果我们想要大量的信息,就进行全面扫描,并处理所需的2.5个小时。在回答您的一些问题时,如果要执行比小查询更多的查询,那么就使用分区。如果没有,那就不要。
发布于 2011-08-23 03:18:54
对于特定的查询,并行性可能不是您最大的问题。新的估计成本和查询时间将大致等于原始成本除以并行度。优化器在这里可能是错误的;例如,如果您只有一个硬盘,那么新计划可能根本不会更快。但是,4倍的估计错误不应导致90倍的性能差异。这使我相信,你的计划已经处于失败的边缘,而这正好推翻了它。你的非平行计划的估计基数和实际基数有多近?无论是什么导致了这些差异,都可能是造成问题的主要原因。
对于你更普遍的问题,没有简单的答案。有几十件事情你可能需要考虑并行性,只有你可以知道哪些将适用于你的情况。你最好的办法是停止搜索它,而是阅读手册。数据仓库指南中的使用并行执行一章是一个很好的起点。
发布于 2013-01-22 04:40:22
SQL中关系或表的程度意味着关系中的属性数。例如:如果SQL中的关系有三行四列,那么它的度是四行。简单地说,我们可以说一个关系的列数称为它的度。
https://stackoverflow.com/questions/7145712
复制相似问题