热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle排序汇总重置成本

我已经记录了一个错误。成本是累积的。例如,查询的简单短语SQLCREATETABLEt(IDINTEGER,flagVARCHAR2(4

SET lines 777
SET pages 10000
SET trimspool ON
--Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
CREATE TABLE t(ID INTEGER PRIMARY KEY,flag VARCHAR2(4000));
INSERT /*+append*/ INTO t
SELECT LEVEL,LPAD('a',4000,' ') FROM dual CONNECT BY LEVEL <= 500000;
COMMIT;
CALL dbms_stats.gather_table_stats(USER,'T');
SELECT /*+gather_plan_statistics*/ *
FROM t
WHERE id = (SELECT MIN(id)
FROM t
WHERE flag LIKE 'a%');
SELECT PLAN_TABLE_OUTPUT FROM table (DBMS_XPLAN.DISPLAY_CURSOR(format => 'ALL RUNSTATS_LAST'));
SQL_ID 5jbcgzgkhfkay, child number 0
-------------------------------------
SELECT /*+gather_plan_statistics*/ * FROM t WHERE id = (SELECT
MIN(id) FROM t WHERE flag LIKE 'a%')
Plan hash value: 2119356367
------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |
------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 0 |00:00:09.95 | 500K| 500K|
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1 | 4006 | 3 (0)| 00:00:01 | 0 |00:00:09.95 | 500K| 500K|
|* 2 | INDEX UNIQUE SCAN | SYS_C00142636 | 1 | 1 | | 2 (0)| 00:00:01 | 0 |00:00:09.95 | 500K| 500K|
| 3 | SORT AGGREGATE | | 1 | 1 | 4006 | | | 1 |00:00:09.95 | 500K| 500K|
|* 4 | TABLE ACCESS FULL | T | 1 | 500K| 1910M| 109K (1)| 00:21:59 | 0 |00:00:09.95 | 500K| 500K|
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
2 - SEL$1 / T@SEL$1
3 - SEL$2
4 - SEL$2 / T@SEL$2
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"=)
4 - filter("FLAG" LIKE 'a%')
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "ID"[NUMBER,22], "T"."FLAG"[VARCHAR2,4000]
2 - "T".ROWID[ROWID,10], "ID"[NUMBER,22]
3 - (#keys=0) MIN("ID")[22]
4 - "ID"[NUMBER,22]

是否有任何合理的解释,为什么如此昂贵的计划的总成本为3,而它包含的完整扫描成本为109K,估计的00:21:59时间?

专家解答


我已经记录了一个错误。
成本是累积的。例如,查询的简单短语

SQL> CREATE TABLE t(ID INTEGER ,flag VARCHAR2(4000)) tablespace largets;

Table created.

SQL>
SQL> INSERT /*+append*/ INTO t
2 SELECT LEVEL,LPAD('a',1000,' ') FROM dual CONNECT BY LEVEL <= 100;

100 rows created.

SQL> COMMIT;

Commit complete.

SQL>
SQL> exec dbms_stats.gather_table_stats(USER,'T');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.set_table_stats('','T',numrows=>1000000000,numblks=>1000000000/8);

PL/SQL procedure successfully completed.

SQL>
SQL> alter table t add primary key ( id );

Table altered.
SQL> SELECT *
2 FROM t , (SELECT MIN(id) c
3 FROM t
4 WHERE flag LIKE 'a%') x
5 WHERE t.id = x.c;

Execution Plan
----------------------------------------------------------
Plan hash value: 420077589

---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 1017 | 33M (1)| 00:22:05 |
| 1 | NESTED LOOPS | | 1 | 1017 | 33M (1)| 00:22:05 |
| 2 | VIEW | | 1 | 13 | 33M (1)| 00:22:05 |
| 3 | SORT AGGREGATE | | 1 | 1004 | | |
|* 4 | TABLE ACCESS FULL | T | 1000M| 935G| 33M (1)| 00:22:05 |
| 5 | TABLE ACCESS BY INDEX ROWID| T | 1 | 1004 | 1 (0)| 00:00:01 |
|* 6 | INDEX UNIQUE SCAN | SYS_C0041530 | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

保持我们预期的成本

推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 从相邻元素对还原数组的解题思路和代码
    本文介绍了从相邻元素对还原数组的解题思路和代码。思路是使用HashMap存放邻接关系,并找出起始点,然后依次取。代码使用了HashMap来存放起始点所在的adjacentPairs中的位置,并对重复的起始点进行处理。 ... [详细]
author-avatar
mhq3022863
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有