zoukankan      html  css  js  c++  java
  • SELECT MIN(object_id),MAX(object_id) FROM TABLE 如何优化

    <pre name="code" class="sql">索引和NULL值
    
    create table test10(id int,name char(10))
    
    
    begin
    for i in 1 .. 100000
    loop
    insert into test10 values(i,'a'||i);
    commit;
    end loop;
    end;
    
    create index test10_idx1 on test10(id);
    
    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                    tabname          => 'TEST10',
                                    estimate_percent => 100,
                                    method_opt       => 'for all columns size repeat',
                                    no_invalidate    => FALSE,
                                    degree           => 8,
                                    cascade          => TRUE);
    END;
    
    insert into test10 values(null,'a');
    
    1.
    SQL> select count(*) from test10;
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 260470369
    
    ---------------------------------------------------------------------
    | Id  | Operation	   | Name   | Rows  | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |	    |	  1 |	 66   (2)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |	    |	  1 |		 |	    |
    |   2 |   TABLE ACCESS FULL| TEST10 |	100K|	 66   (2)| 00:00:01 |
    ---------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  0  recursive calls
    	  0  db block gets
    	293  consistent gets
    	  0  physical reads
    	  0  redo size
    	425  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    
    SQL> select count(id) from test10;   
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 3206018756
    
    -------------------------------------------------------------------------------------
    | Id  | Operation	      | Name	    | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      | 	    |	  1 |	  5 |	 50   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE       | 	    |	  1 |	  5 |		 |	    |
    |   2 |   INDEX FAST FULL SCAN| TEST10_IDX1 |	100K|	488K|	 50   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  0  recursive calls
    	  0  db block gets
    	228  consistent gets
    	  0  physical reads
    	  0  redo size
    	424  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    
    
    2.
    SQL> select id from test10;
    
    已选择100001行。
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 4117858598
    
    ----------------------------------------------------------------------------
    | Id  | Operation	  | Name   | Rows  | Bytes | Cost (%CPU)| Time	   |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |	   |   100K|   488K|	66   (2)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| TEST10 |   100K|   488K|	66   (2)| 00:00:01 |
    ----------------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  0  recursive calls
    	  0  db block gets
           6943  consistent gets
    	  0  physical reads
    	  0  redo size
        1455977  bytes sent via SQL*Net to client
          73741  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
         100001  rows processed
    
    SQL>  select id from test10 where id is not null;
    
    已选择100000行。
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 1361564665
    
    ------------------------------------------------------------------------------------
    | Id  | Operation	     | Name	   | Rows  | Bytes | Cost (%CPU)| Time	   |
    ------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |		   |   100K|   488K|	50   (0)| 00:00:01 |
    |*  1 |  INDEX FAST FULL SCAN| TEST10_IDX1 |   100K|   488K|	50   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("ID" IS NOT NULL)
    
    
    统计信息
    ----------------------------------------------------------
    	  1  recursive calls
    	  0  db block gets
           6880  consistent gets
    	  0  physical reads
    	  0  redo size
        1455975  bytes sent via SQL*Net to client
          73741  bytes received via SQL*Net from client
           6668  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
         100000  rows processed
    
    3.
    SQL> select max(id) from test10;
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 2324431888
    
    ------------------------------------------------------------------------------------------
    | Id  | Operation		   | Name	 | Rows  | Bytes | Cost (%CPU)| Time	 |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	   |		 |     1 |     5 |    66   (2)| 00:00:01 |
    |   1 |  SORT AGGREGATE 	   |		 |     1 |     5 |	      | 	 |
    |   2 |   INDEX FULL SCAN (MIN/MAX)| TEST10_IDX1 |   100K|   488K|	      | 	 |
    ------------------------------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  0  recursive calls
    	  0  db block gets
    	  2  consistent gets
    	  0  physical reads
    	  0  redo size
    	422  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    如果希望直接从索引返回数据,由于索引不存储NULL值,则需要显示说明 is not null
    
    4.
    SQL>     select max(id),min(id) from test10; 
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 260470369
    
    -----------------------------------------------------------------------------
    | Id  | Operation	   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |	    |	  1 |	  5 |	 66   (2)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |	    |	  1 |	  5 |		 |	    |
    |   2 |   TABLE ACCESS FULL| TEST10 |	100K|	488K|	 66   (2)| 00:00:01 |
    -----------------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  1  recursive calls
    	  0  db block gets
    	293  consistent gets
    	  0  physical reads
    	  0  redo size
    	486  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    
    
    为什么不走索引呢?
    
    这条语句要同时获得两个值, oracle的INDEX FULL SCAN (MIN/MAX)是无法一次取到两个值的
    
    
    SQL>  select max(id),min(id) from test10 where id is not null;
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 3206018756
    
    -------------------------------------------------------------------------------------
    | Id  | Operation	      | Name	    | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      | 	    |	  1 |	  5 |	 50   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE       | 	    |	  1 |	  5 |		 |	    |
    |*  2 |   INDEX FAST FULL SCAN| TEST10_IDX1 |	100K|	488K|	 50   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("ID" IS NOT NULL)
    
    
    统计信息
    ----------------------------------------------------------
    	  1  recursive calls
    	  0  db block gets
    	228  consistent gets
    	  0  physical reads
    	  0  redo size
    	486  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)
    	  1  rows processed
    
    
    
    
    SQL> select (select max(id)from test10),(select min(id)from test10) from dual;
    
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 3694443619
    
    ------------------------------------------------------------------------------------------
    | Id  | Operation		   | Name	 | Rows  | Bytes | Cost (%CPU)| Time	 |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	   |		 |     1 |	 |     2   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE 	   |		 |     1 |     5 |	      | 	 |
    |   2 |   INDEX FULL SCAN (MIN/MAX)| TEST10_IDX1 |   100K|   488K|	      | 	 |
    |   3 |  SORT AGGREGATE 	   |		 |     1 |     5 |	      | 	 |
    |   4 |   INDEX FULL SCAN (MIN/MAX)| TEST10_IDX1 |   100K|   488K|	      | 	 |
    |   5 |  FAST DUAL		   |		 |     1 |	 |     2   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------
    
    
    统计信息
    ----------------------------------------------------------
    	  1  recursive calls
    	  0  db block gets
    	  4  consistent gets
    	  0  physical reads
    	  0  redo size
    	522  bytes sent via SQL*Net to client
    	415  bytes received via SQL*Net from client
    	  2  SQL*Net roundtrips to/from client
    	  0  sorts (memory)
    	  0  sorts (disk)


    
                                        
    
  • 相关阅读:
    结合react-amap使用高德地图的原生API
    QSqlRelationalTableModel的Select语句会改变列的名字
    实体对象模型中使用自跟踪实体分离Model和Context
    An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while Tomcat
    一步一步学习Unity3d学习笔记系1.4单服模式架构
    MongoDB的连接字符串
    将QQl里面的休息都迁移过来了
    WPF一段代码搞定所有的点击事件
    ini配置文件的读取
    手写Json转换
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352110.html
Copyright © 2011-2022 走看看