暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle View对象-外部联接的性能问题,包括wing子句

askTom 2018-09-13
251

问题描述

嗨,汤姆;

谢谢,我已经使用您的网站两年了,根据您的答案解决了许多问题。

案例场景: 客户有多个地址,只有一个处于活动状态; 在某些情况下,客户的所有地址都可能处于非活动状态。视图必须显示活动客户和活动地址信息。
如果活动客户没有活动地址,则仍然必须显示客户信息。

ISSUE : Performance is slow using an outer-join between the customer table and the WITH clause query.

LIVESQL脚本:

https://livesql.oracle.com/apex/livesql/s/g89d3dhdjcdcbee2w7sowl4gf

这是视图脚本:

CREATE VIEW vw1 AS   
WITH addr as ( select t2.customerid, 
                      t3.address,  
                      t3.country  
                 from t2,t3 
                where t2.active = 'Y' 
                  and t2.addrid = t3.addrid )  
SELECT t1.name, 
       t1.email, 
       addr.address, 
       addr.country 
  FROM t1, 
       addr 
 WHERE addr.customerid (+) = t1.customerid;


这里是解释计划细节的原始声明:

Plan

SELECT STATEMENT ALL_ROWS Cost: 169,756 Bytes: 1,683,219,820 Cardinality: 4,261,316
10 HASH JOIN RIGHT OUTER Cost: 169,756 Bytes: 1,683,219,820 Cardinality: 4,261,316
8 VIEW VW1 Cost: 151,669 Bytes: 245 Cardinality: 1
7 FILTER
6 HASH GROUP BY Cost: 151,669 Bytes: 132 Cardinality: 1
5 HASH JOIN Cost: 150,844 Bytes: 745,357,536 Cardinality: 5,646,648
3 HASH JOIN Cost: 39,009 Bytes: 293,200,180 Cardinality: 5,638,465
1 TABLE ACCESS FULL TABLE T2 Cost: 11,725 Bytes: 110,754,514 Cardinality: 4,259,789
2 TABLE ACCESS FULL TABLE T2 Cost: 11,725 Bytes: 110,754,514 Cardinality: 4,259,789
4 TABLE ACCESS FULL TABLE T3 Cost: 57,221 Bytes: 682,904,560 Cardinality: 8,536,307
9 TABLE ACCESS FULL TABLE T1 Cost: 18,025 Bytes: 639,197,400 Cardinality: 4,261,316


还有其他方法可以实现更好的性能吗?

专家解答

如果计划中的统计信息是准确的,则您正在处理并返回超过400万行。那需要一段时间!

您可以在基数部分 (例如,基数: 4,259,789) 中看到这一点。

如果相对较少的地址是活动的,则索引为:

t2 (addrid,active)

反之亦然可能会有所帮助。

但是最终,如果您希望此查询更快,则需要获取一个小得多的数据集。将数百万行从数据库发送到客户端的行为将需要一段时间。

如果您需要更多帮助,请获取查询的执行计划。这包括有关它在每个步骤中处理了多少行的信息。跟踪查询还将显示您等待传输数据等事情的时间。有关如何获取计划的详细信息,请参见:

https://blogs.oracle.com/sql/how-to-create-an-execution-plan
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论