gre*_*ade 11 oracle data-warehouse
在 Oracle Exadata (11gR2) 上,我们有一个相对强大的数据库。
我们注意到,通过在 Oracle Enterprise Manager (OEM) 中的观察,由于查询是串行执行的,性能很差。为了解决这个问题,所有表、物化视图和索引都进行了更改以利用并行性。例如:
ALTER TABLE SOME_TABLE PARALLEL (DEGREE DEFAULT INSTANCES DEFAULT);
Run Code Online (Sandbox Code Playgroud)
系统已更改为打开并行化:
ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = 'AUTO';
Run Code Online (Sandbox Code Playgroud)
这导致了更好的性能,但我们偶尔会在 OEM 中观察到单个查询会占用 96(所有可用资源)的 DOP。这导致后续查询被降级为 DOP 1(无并行化)。导致性能不佳,直到占用查询完成。
为了解决这个问题,我们尝试通过以下方式限制可用于任何查询的 DOP:
ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;
Run Code Online (Sandbox Code Playgroud)
这没有效果。我们经常观察到使用超过限制的查询(通常为 48 或 96,但没有实际模式)。
我们如何防止任何单个查询占用所有可用资源?
并行服务器集: PARALLEL_DEGREE_LIMIT 限制并行度,但如果您的查询是排序或分组,并行进程的数量可以是两倍(两个服务器集以启用进程间并行性)。这就解释了为什么即使限制为 24,您也会看到 48 个并行进程。如果您使用资源管理器来限制 DOP,也会发生这种情况。
并行提示: PARALLEL_DEGREE_LIMIT 仅适用于使用自动并行度的语句。任何使用硬编码度的语句,甚至任何类型的对象级并行提示,都将忽略该限制。如果您有这些提示,那就可以解释为什么您有时会看到 96。
Calibrate IO: 可能未使用自动 DOP,因此未遵循限制,因为未校准IO 。此查询将告诉您 IO 是否已校准:
select * from V$IO_CALIBRATION_STATUS;
Run Code Online (Sandbox Code Playgroud)
我以前见过这会导致问题,但我当前的系统没有校准,自动 DOP 似乎工作正常。您可以通过查看解释计划的注释部分来判断这是否真的是一个问题。如果你看到类似- automatic DOP: Computed Degree of Parallelism is 2你很好的东西,但你不想看到automatic DOP: skipped because of IO calibrate statistics are missing。
增加 PARALLEL_MAX_SERVERS: 我建议您显着增加 PARALLEL_MAX_SERVERS,而不是担心用完并行服务器。您至少应该尝试回到默认值PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5,在 240 到 960 之间,具体取决于您的内存设置。
对于许多 DBA 来说,这些高数字听起来很荒谬,但由于以下原因,它们实际上很有意义:
| 归档时间: |
|
| 查看次数: |
20250 次 |
| 最近记录: |