问题描述
嗨,汤姆;
谢谢,我已经使用您的网站两年了,根据您的答案解决了许多问题。
案例场景: 客户有多个地址,只有一个处于活动状态; 在某些情况下,客户的所有地址都可能处于非活动状态。视图必须显示活动客户和活动地址信息。
如果活动客户没有活动地址,则仍然必须显示客户信息。
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
这是视图脚本:
这里是解释计划细节的原始声明:
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
还有其他方法可以实现更好的性能吗?
谢谢,我已经使用您的网站两年了,根据您的答案解决了许多问题。
案例场景: 客户有多个地址,只有一个处于活动状态; 在某些情况下,客户的所有地址都可能处于非活动状态。视图必须显示活动客户和活动地址信息。
如果活动客户没有活动地址,则仍然必须显示客户信息。
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
您可以在基数部分 (例如,基数: 4,259,789) 中看到这一点。
如果相对较少的地址是活动的,则索引为:
t2 (addrid,active)
反之亦然可能会有所帮助。
但是最终,如果您希望此查询更快,则需要获取一个小得多的数据集。将数百万行从数据库发送到客户端的行为将需要一段时间。
如果您需要更多帮助,请获取查询的执行计划。这包括有关它在每个步骤中处理了多少行的信息。跟踪查询还将显示您等待传输数据等事情的时间。有关如何获取计划的详细信息,请参见:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




