管理 sql 执行的并行度

Manage the parallel degree of sql execution

我有一个进程发送大量要并行执行的命令。

命令示例:

Insert /*+ parallel(16) */ ...

问题是,如果请求的并行度高于可用服务器,则命令的并行度会降低, 因为我发送了几个命令,所以它们 "steal" 彼此并行的服务器。

我有一个特定的查询,它比较重要,需要 运行 与请求的并行,而其他查询不太重要。

有没有办法强制优化器降低其他语句的并行度,增加重要查询的并行度?

有没有办法改变语句启动后的并行度运行ning?

我正在使用 Oracle 11g。

是的,您可以使用资源管理器。

11gr2 文档甚至有一个示例场景,基本上符合您的要求...有些工作比其他工作更重要,如何限制并行进程以为重要的工作释放资源

https://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN13471

Oracle-Base of course also covers this feature. -- 如您所见,它已经存在了很长时间。

请注意,您需要 Oracle 数据库的企业版许可副本才能使用此功能...但是如果您开始使用那么多 CPU,我想您已经拥有了?

查看语句队列和 PARALLEL_MAX_SERVERS 等参数,以确保重要进程获得足够的并行服务器。 (根据我的经验,设置资源管理器太复杂,而且很少能做好。)

语句排队

在 运行ning 期间,无法将并行服务器从一个语句移动到另一个语句。但是,通过语句队列,我们​​可以要求 Oracle 在拥有必要的并行资源之前不要 运行 重要的语句。对于大型并行进程来说,等待一分钟并获取所有请求的并行服务器可能比仅使用部分资源立即 运行 更好。

在最重要的语句中使用提示 /*+ parallel(16) statement_queuing*/

确保参数 PARALLEL_SERVERS_TARGET 设置正确 - 语句队列将只使用不超过该数量的并行服务器。您可能希望将该参数设置为与 PARALLEL_MAX_SERVERS.

相同

PARALLEL_MAX_SERVERS

确保参数 PARALLEL_MAX_SEERVERS 设置正确。这是一个很难设置的值,我经常看到较低的值。请记住,Oracle 并行服务器是相对轻量级的进程。在大多数情况下,分配的服务器中有一半只会用于存储中间结果,不会 运行ning.

例如,如果您的系统有 32 个内核,您应该将 PARALLEL_MAX_SERVERS 设置为 至少 64,如果不是 128 或 256。许多 DBA 错误地降低了该值for PARALLEL_MAX_SERVERS 测试前。根据我的经验和测试,Oracle 服务器可以有效地处理比大多数人意识到的更多的并行服务器。