【SQL 学习】排序问题之order by与索引排序

简介: SQL> conn yang/yang as sysdba已连接。SQL> create table t as select object_id id ,object_name name  2  from dba_objects ;表已创建。
SQL> conn yang/yang as sysdba
已连接。
SQL> create table t as select object_id id ,object_name name
  2  from dba_objects ;
表已创建。
SQL> set autot traceonly
一次普通的全表扫描,没有排序的!
SQL> select id ,name from t;
已选择68372行。
执行计划
----------------------------------------------------------                      
Plan hash value: 1601196873                                                    
--------------------------------------------------------------------------      
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |      
--------------------------------------------------------------------------      
|   0 | SELECT STATEMENT  |      | 64794 |  4998K|    91   (2)| 00:00:02 |      
|   1 |   TABLE ACCESS FULL| T    | 64794 |  4998K|    91   (2)| 00:00:02 |      
--------------------------------------------------------------------------      
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement
统计信息
----------------------------------------------------------                      
         68  recursive calls                                                    
          0  db block gets                                                      
       4943  consistent gets                                                    
        325  physical reads                                                     
          0  redo size                                                          
    2936793  bytes sent via SQL*Net to client                                   
      50554  bytes received via SQL*Net from client                             
       4560  SQL*Net roundtrips to/from client                                  
           0  sorts (memory)                                                     
          0  sorts (disk)                                                       
      68372  rows processed    
--根据id 排序!注意执行计划里面的TempSpc 是临时空间,大小11M
SQL> select id ,name from t order by id;
已选择68372行。
执行计划
----------------------------------------------------------                      
Plan hash value: 961378228                                                      
----------------------------------------------------------------------------------               
| Id  | Operation          | Name | Rows  | Bytes | TempSpc| Cost (%CPU)| Time | 
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 64794 |  4998K|    |  1283   (1)| 00:00:16 | 
|   1 |   SORT ORDER BY     |      | 64794 |  4998K|     11M|  1283   (1)| 00:00:16 | 
|   2 |   TABLE ACCESS FULL| T    | 64794 |  4998K|       |    91   (2)| 00:00:02 |
----------------------------------------------------------------------------------- 
Note                                                                            
-----                                                                           
   - dynamic sampling used for this statement                                   
统计信息
----------------------------------------------------------                      
          4  recursive calls                                                    
          0  db block gets                                                      
        394  consistent gets                                                    
          0  physical reads                                                     
          0  redo size                                                          
    2663362  bytes sent via SQL*Net to client                                   
      50554  bytes received via SQL*Net from client                             
       4560  SQL*Net roundtrips to/from client                                  
          1  sorts (memory)                                                     
          0  sorts (disk)                                                       
      68372  rows processed                                                     

--在表的 id 字段建立索引,并进行信息统计。
SQL> create index idx_id on t(id) ;
索引已创建。
SQL> exec dbms_stats.gather_table_stats(user ,'T',cascade => true);
PL/SQL 过程已成功完成。

SQL> select id ,name from t order by id;
已选择68372行。
执行计划
----------------------------------------------------------                      
Plan hash value: 961378228                                                     
-----------------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | TempSpc| Cost (%CPU)| Time   | 
----------------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT   |      | 68372 |  1936K|       |   638   (1)| 00:00:08 |
|   1 |   SORT ORDER BY     |      | 68372 |  1936K|  5384K|   638   (1)| 00:00:08 |
|   2 |   TABLE ACCESS FULL| T    | 68372 |  1936K|       |    91   (2)| 00:00:02 |
-----------------------------------------------------------------------------------              
统计信息
----------------------------------------------------------                      
        151  recursive calls                                                    
          0  db block gets                                                      
        348  consistent gets                                                    
          0  physical reads                                                     
          0  redo size                                                          
    2663362  bytes sent via SQL*Net to client                                   
      50554  bytes received via SQL*Net from client                             
       4560  SQL*Net roundtrips to/from client                                  
           5  sorts (memory) --没有使用索引比全表扫描多了四此排序
          0  sorts (disk)                                                       
      68372  rows processed    
--使用索引。执行计划中没有tempspac                                              
SQL> select id ,name from t where id order by id; --加上了order by
已选择1133行。
执行计划
---------------------------------------------------------- 
Plan hash value: 827754323
--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |  1167 | 33843 |    10   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |  1167 | 33843 |    10   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_ID |  1167 |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id): 
--------------------------------------------------- 
   2 - access("ID"
统计信息
---------------------------------------------------------- 
          1  recursive calls  
          0  db block gets   
        160  consistent gets 
          0  physical reads  
          0  redo size   
      37872  bytes sent via SQL*Net to client  
       1241  bytes received via SQL*Net from client
         77  SQL*Net roundtrips to/from client   
          0  sorts (memory) --这里可以看出没有排序!
          0  sorts (disk)   
       1133  rows processed 


小结:
如果数据直接从索引获取,也是有序的,此时加order by,cbo不会执行sort 排序动作的。即,加上order by对性能也不会有什么影响!
其实这里还是有疑问的
1 根据id 排序 走全表扫描和建立了索引后信息统计上有差别,前者比后者少了3个sort 操作!而后者的TempSpc比全表扫描少了将近一半!
2 关于TempSpc 的理解如果是临时表空间 ,就用到了磁盘排序了 ,而执行上面没有显示disk sort!
   对这两个问题问个为什么?
阅读(5397) | 评论(0) | 转发(0) |
目录
相关文章
|
算法 关系型数据库 MySQL
【MySQL系列】Select语句单表查询详解(二)ORDERBY排序
文章目录 一、排序ORDER BY 1.ORDER BY的格式: 2.ORDER BY的作用: 3.ORDER BY的使用: 1️⃣ 按照字段名排序 2️⃣按字段照序号进行排序 3️⃣降序DESC 4️⃣根据多列排序 5️⃣还可以结合搭配函数或者一些查询条件使用。
|
7天前
|
SQL 关系型数据库 MySQL
SQL中,可以使用 `ORDER BY` 子句来实现排序功能
【10月更文挑战第26天】SQL中,可以使用 `ORDER BY` 子句来实现排序功能
32 5
|
6月前
|
SQL
SQL语句两个字段或多个字段同时order by 排序
SQL语句两个字段或多个字段同时order by 排序
999 0
|
6月前
|
SQL 数据库管理
sqlite语句order by两个字段同时排序处理
sqlite语句order by两个字段同时排序处理
61 0
|
12月前
|
SQL
解决union查询order by 排序失效的问题
解决union查询order by 排序失效的问题
217 0
|
SQL 数据库
使用 SQL 进行排序查询
在数据库中,我们经常需要对查询的结果进行排序,以便更容易地理解和分析数据。SQL(Structured Query Language)提供了强大的排序功能,允许我们按照指定的列对数据进行升序或降序排序。本文将详细介绍如何使用 SQL 进行排序查询,包括基本的排序语法、多列排序、自定义排序顺序等内容。
356 0
|
SQL
ORDER BY:对查询结果进行排序
ORDER BY:对查询结果进行排序
107 0
|
SQL Oracle 关系型数据库
SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
我们通常需要根据客户需求对于查询出来的结果给客户提供自定义的排序方式,那么我们通常sql需要实现方式都有哪些,参考更多资料总结如下(不完善的和错误望大家指出): 一、如果我们只是对于在某个程序中的应用是需要按照如下的方式排序,我们只需在SQL语句级别设置排序方式:
643 0
|
SQL
【SQL系列】按多字段排序
【SQL系列】按多字段排序
117 0
|
SQL
SQL语句之排序 —— ORDER BY
SQL语句之排序 —— ORDER BY
1259 0
SQL语句之排序 —— ORDER BY