如何通过执行 union all 来减少同时运行的查询的 CPU 利用率

发布于 2025-01-15 17:17:34 字数 1077 浏览 3 评论 0原文

生成报告时向我报告了高 CPU 利用率问题。 在与报表相关的过程中,已发现通过执行 UNION ALL 执行 6 到 7 种类型的查询(每个查询的逻辑不同),如 SQL 查询中所示。每个查询使用 10 到 12 个表并相互连接。所有输出列都引用每个查询中使用的几乎所有表。

整个查询执行时间约为30秒到40秒。查询性能没有问题。但仅此查询的 CPU 利用率才达到 50%。如果多个用户同时生成相同的报告,则CPU利用率>99%。

我需要有关如何降低 CPU 利用率的建议。

注意:提供示例查询仅供参考,不会执行。

SELECT SUM(QTY) QTY, SUM(RATE) RATE, COALESCE(CITY_ADDR,STATE_ADDR) ADDR,
       LISTAGG(DISTINCT PRODUCT, ', ') WITHIN GROUP(ORDER BY PRODID) PRODUCT
       C.CUSTOEMR
FROM TBLINVENTORY I 
INNER JOIN TBLPRODUCT P
INNER JOIN TBLCUSTOMER C
LEFT JOIN TBLADDRESS A
--- LIKE THIS JOINING 12 TABLES 
WHERE I.ID = 1234 AND C.CUSTOMERID = 4567
GROUP BY ADDR,PRODUCT, CUSTOMER

UNION ALL

SELECT SUM(QTY) QTY, SUM(RATE) RATE, COALESCE(CITY_ADDR,STATE_ADDR) ADDR,
       LISTAGG(DISTINCT PRODUCT, ', ') WITHIN GROUP(ORDER BY PRODID) PRODUCT
       C.CUSTOEMR
FROM TBLINVENTORY I 
INNER JOIN TBLPRODUCT P
INNER JOIN TBLCUSTOMER C
LEFT JOIN TBLADDRESS A
--- LIKE THIS JOINING 12 TABLES 
WHERE I.ID = 1234 AND C.CUSTOMERID = 4567
GROUP BY ADDR,PRODUCT, CUSTOMER

UNION ALL
...

High CPU Utilization issue reported to me while generating a report.
In report related procedure, it's been identified that 6 to 7 types of queries (logic for each query is different) are executing by doing UNION ALL as shown in the SQL query. Each query is using 10 to 12 tables and joining each other. And All output columns are referencing almost all the tables using in each query.

Entire query execution time is about 30 seconds to 40 seconds. There is no issue with performance of query. But CPU utilization is taking 50% only for this query. If multiple user generate same report at the same time, then CPU utilization is >99%.

I need suggestions on how to reduce CPU utilization.

Note: Provide sample query is just for reference purpose and it will not execute.

SELECT SUM(QTY) QTY, SUM(RATE) RATE, COALESCE(CITY_ADDR,STATE_ADDR) ADDR,
       LISTAGG(DISTINCT PRODUCT, ', ') WITHIN GROUP(ORDER BY PRODID) PRODUCT
       C.CUSTOEMR
FROM TBLINVENTORY I 
INNER JOIN TBLPRODUCT P
INNER JOIN TBLCUSTOMER C
LEFT JOIN TBLADDRESS A
--- LIKE THIS JOINING 12 TABLES 
WHERE I.ID = 1234 AND C.CUSTOMERID = 4567
GROUP BY ADDR,PRODUCT, CUSTOMER

UNION ALL

SELECT SUM(QTY) QTY, SUM(RATE) RATE, COALESCE(CITY_ADDR,STATE_ADDR) ADDR,
       LISTAGG(DISTINCT PRODUCT, ', ') WITHIN GROUP(ORDER BY PRODID) PRODUCT
       C.CUSTOEMR
FROM TBLINVENTORY I 
INNER JOIN TBLPRODUCT P
INNER JOIN TBLCUSTOMER C
LEFT JOIN TBLADDRESS A
--- LIKE THIS JOINING 12 TABLES 
WHERE I.ID = 1234 AND C.CUSTOMERID = 4567
GROUP BY ADDR,PRODUCT, CUSTOMER

UNION ALL
...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乖乖兔^ω^ 2025-01-22 17:17:34

由于 并发执行 union all。从 12.1 开始,使用 UNION ALL 的查询可以并行运行每个分支以提高性能。要关闭该功能,请使用提示 /*+ NO_PQ_CONCURRENT_UNION */。如果使用不同类型的并行性,/*+ NO_PARALLEL */ 提示可能会有所帮助。

要检查是否正在使用并行性,请运行以下查询以查找相关语句的 SQL_ID,然后生成该 SQL_ID 的执行计划。在执行计划中,如果您看到名称类似于“PX”的操作,则说明正在使用并行性。

select sql_id, sql_fulltext from gv$sql where lower(sql_fulltext) like lower('%LISTAGG(DISTINCT PRODUCT%');
select * from table(dbms_xplan.display_cursor(sql_id => 'Enter SQL_ID here'));

或者,可能有一种方法可以从查询中重构 UNION ALL,例如使用 UNPIVOT

Your query might be using a large amount of CPU because of concurrent execution of union all. Since 12.1, queries with UNION ALL may run each branch in parallel to improve performance. To turn off that feature, use the hint /*+ NO_PQ_CONCURRENT_UNION */. If a different kind of parallelism is used, the /*+ NO_PARALLEL */ hint may help.

To check if parallelism is being used, run the below queries to find the SQL_ID of the relevant statement and then generate the execution plan for that SQL_ID. In the execution plan, if you see operations with names like "PX", then parallelism is being used.

select sql_id, sql_fulltext from gv$sql where lower(sql_fulltext) like lower('%LISTAGG(DISTINCT PRODUCT%');
select * from table(dbms_xplan.display_cursor(sql_id => 'Enter SQL_ID here'));

Alternatively, there may be a way to refactor the UNION ALL out of your query, perhaps using UNPIVOT.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文