管理 SQL 执行的并行程度



我有一个进程,它发送了很多命令并行执行。

命令示例:

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

问题是,如果请求的并行高于可用服务器,则该命令将在并行度上降级, 并且因为我发送了几个命令来收集它们,所以它们会相互"窃取"并行服务器。

我有一个特定的查询,它更重要,需要使用请求的并行运行,而其他查询则不太重要。

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

有没有办法在语句开始运行后更改语句的并行度数?

我使用的是甲骨文 11g。

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

语句排队

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

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

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

PARALLEL_MAX_SERVERS

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

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

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

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

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

当然,Oracle-Base也涵盖了这个功能。 - 正如你所看到的,它已经存在了很长时间。

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

相关内容

  • 没有找到相关文章

最新更新