那么,标题描述了我最近刚刚遇到的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的最佳做法是什么?如果我想要做的是通过多线程提供最佳读取性能,那么设置应该是什么?
很多问题在这里。非常感谢提前。
另请注意,并行操作将消耗大量**资源,因此仅适用于单个大批量作业(并且在大多数多用户环境中不建议) –