问题描述
嗨,
我检查了Select查询的EXPLAIN计划 (在SQL Devloper工具中,按F10捷径键),在那里我注意到一列基数与成本。
随着基数的增加,我注意到成本的增加,我读到Optimizer选择了较少的成本计划来执行查询,因此我认为成本是optimzer执行查询所花费的时间。那么这个基数是什么?及其与成本的关系。
我检查了Select查询的EXPLAIN计划 (在SQL Devloper工具中,按F10捷径键),在那里我注意到一列基数与成本。
随着基数的增加,我注意到成本的增加,我读到Optimizer选择了较少的成本计划来执行查询,因此我认为成本是optimzer执行查询所花费的时间。那么这个基数是什么?及其与成本的关系。
专家解答
基数是步骤将返回的估计行数。
成本是计划将要做的工作量的估计。
较高的基数 => 您将获取更多行 => 您将做更多的工作 => 查询将花费更长的时间。因此,成本 (通常) 更高。
在所有其他条件相同的情况下,具有更高成本的查询将使用更多的资源,因此运行时间更长。但是所有的东西很少是平等的。成本较低的查询可以比成本较高的查询运行得更快!
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:313416745628
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5639863000346345766
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:40112614814595
成本对于弄清楚优化器为什么选择 (例如) 索引上的全表扫描是有用的。但在大多数情况下忽略它。
一个更好的问题是:
“(估计的) 基数是否大致等于语句处理的实际行数?”
如果该计划的所有步骤的答案均为 “是”,则很可能您的查询有 “最佳” 计划。
要弄清楚这一点,你需要执行计划。这显示了处理的行数。有关如何创建这些内容的说明,请参见:
https://blogs.oracle.com/sql/entry/how_to_create_an_execution
然后将估计值与实际值进行比较,看看它们是否接近。注意,您需要将 “开始” 列中的值乘以 “估计” 中的值,以获取要与实际行进行比较的值。
最后说明: 如果您要获取估计时间,请说明计划包括以下内容:
请记住: 这是一个估计值,只有一秒钟!
成本是计划将要做的工作量的估计。
较高的基数 => 您将获取更多行 => 您将做更多的工作 => 查询将花费更长的时间。因此,成本 (通常) 更高。
在所有其他条件相同的情况下,具有更高成本的查询将使用更多的资源,因此运行时间更长。但是所有的东西很少是平等的。成本较低的查询可以比成本较高的查询运行得更快!
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:313416745628
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5639863000346345766
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:40112614814595
成本对于弄清楚优化器为什么选择 (例如) 索引上的全表扫描是有用的。但在大多数情况下忽略它。
一个更好的问题是:
“(估计的) 基数是否大致等于语句处理的实际行数?”
如果该计划的所有步骤的答案均为 “是”,则很可能您的查询有 “最佳” 计划。
要弄清楚这一点,你需要执行计划。这显示了处理的行数。有关如何创建这些内容的说明,请参见:
https://blogs.oracle.com/sql/entry/how_to_create_an_execution
然后将估计值与实际值进行比较,看看它们是否接近。注意,您需要将 “开始” 列中的值乘以 “估计” 中的值,以获取要与实际行进行比较的值。
最后说明: 如果您要获取估计时间,请说明计划包括以下内容:
set serveroutput off
explain plan for
select * from dual;
select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 4017058736
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
请记住: 这是一个估计值,只有一秒钟!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




