oracle存储过程排序算法,sort order by stopkey 和sort order by 排序不同?

管理版的问题 不大明白,来这里讨论一下:

create table product

(

pro_id    number,

pro_name  varchar2(20),

pro_info  varchar2(60),

pro_price number,

pro_user  varchar2(20)

);

alter table PRODUCT add constraint PRI_PRO_ID primary key (PRO_ID);

insert into product values(28985,'SYS','/1000e8d1_LinkedHashMapValueIt',30137,'JAVA CLASS');

insert into product values(28986,'PUBLIC','/1000e8d1_LinkedHashMapValueIt',30138,'SYNONYM');

insert into product values(15935,'SYS','/1005bd30_LnkdConstant',17087,'JAVA CLASS');

insert into product values(15936,'PUBLIC','/1005bd30_LnkdConstant',17089,'SYNONYM');

insert into product values(15937,'PUBLIC','/1005bd30_LnkdConstant',17090,'SYNONY');

insert into product values(15938,'PUBLIC','/1005bd30_LnkdConstant',17091,'SYNONYMM');

insert into product values(15939,'PUBLIC','/1005bd30_LnkdConstant',17092,'SYNONYMZ');

insert into product values(15940,'PUBLIC','/1005bd30_LnkdConstant',17093,'SYNONYMg');

MYDB@MYDB10G >select rownum,a.* from (select * from product ORDER BY pro_info) a;

ROWNUM     PRO_ID PRO_NAME             PRO_INFO                                                   PRO_PRICE PRO_USER

---------- ---------- -------------------- ------------------------------------------------------------ ---------- --------------------

1      28985 SYS                  /1000e8d1_LinkedHashMapValueIt                                    30137 JAVA CLASS

2      28986 PUBLIC               /1000e8d1_LinkedHashMapValueIt                                    30138 SYNONYM

3      15937 PUBLIC               /1005bd30_LnkdConstant                                            17090 SYNONY

4      15938 PUBLIC               /1005bd30_LnkdConstant                                            17091 SYNONYMM

5      15939 PUBLIC               /1005bd30_LnkdConstant                                            17092 SYNONYMZ

6      15940 PUBLIC               /1005bd30_LnkdConstant                                            17093 SYNONYMg

7      15935 SYS                  /1005bd30_LnkdConstant                                            17087 JAVA CLASS

8      15936 PUBLIC               /1005bd30_LnkdConstant                                            17089 SYNONYM

已选择8行。

MYDB@MYDB10G >select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  a0dmy1cd3qg94, child number 1

-------------------------------------

select rownum,a.* from (select * from product ORDER BY pro_info) a

Plan hash value: 722800309

---------------------------------------------------------------------------------------------------------------------

| Id  | Operation            | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

---------------------------------------------------------------------------------------------------------------------

|   1 |  COUNT               |         |      1 |        |      8 |00:00:00.01 |       7 |       |    |     |

|   2 |   VIEW               |         |      1 |      8 |      8 |00:00:00.01 |       7 |       |    |     |

|   3 |    SORT ORDER BY     |         |      1 |      8 |      8 |00:00:00.01 |       7 |  2048 |  2048 | 2048  (0)|

|   4 |     TABLE ACCESS FULL| PRODUCT |      1 |      8 |      8 |00:00:00.01 |       7 |       |    |     |

---------------------------------------------------------------------------------------------------------------------

Note

-----

- dynamic sampling used for this statement

已选择19行。

MYDB@MYDB10G >select rownum , a.* from (select * from product ORDER BY pro_info) a where rownum<21;

ROWNUM     PRO_ID PRO_NAME             PRO_INFO                                                   PRO_PRICE PRO_USER

---------- ---------- -------------------- ------------------------------------------------------------ ---------- --------------------

1      28985 SYS                  /1000e8d1_LinkedHashMapValueIt                                    30137 JAVA CLASS

2      28986 PUBLIC               /1000e8d1_LinkedHashMapValueIt                                    30138 SYNONYM

3      15935 SYS                  /1005bd30_LnkdConstant                                            17087 JAVA CLASS

4      15936 PUBLIC               /1005bd30_LnkdConstant                                            17089 SYNONYM

5      15937 PUBLIC               /1005bd30_LnkdConstant                                            17090 SYNONY

6      15938 PUBLIC               /1005bd30_LnkdConstant                                            17091 SYNONYMM

7      15939 PUBLIC               /1005bd30_LnkdConstant                                            17092 SYNONYMZ

8      15940 PUBLIC               /1005bd30_LnkdConstant                                            17093 SYNONYMg

已选择8行。

MYDB@MYDB10G >select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  a1ksua9f6w984, child number 1

-------------------------------------

select rownum , a.* from (select * from product ORDER BY pro_info) a where rownum<21

Plan hash value: 3153827937

------------------------------------------------------------------------------------------------------------------------

| Id  | Operation               | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

------------------------------------------------------------------------------------------------------------------------

|*  1 |  COUNT STOPKEY          |         |      1 |        |      8 |00:00:00.01 |       7 |       |       |          |

|   2 |   VIEW                  |         |      1 |      8 |      8 |00:00:00.01 |       7 |       |       |          |

|*  3 |    SORT ORDER BY STOPKEY|         |      1 |      8 |      8 |00:00:00.01 |       7 |  2048 |  2048 | 2048  (0)|

|   4 |     TABLE ACCESS FULL   | PRODUCT |      1 |      8 |      8 |00:00:00.01 |       7 |       |       |          |

------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter(ROWNUM<21)

3 - filter(ROWNUM<21)

Note

-----

- dynamic sampling used for this statement

已选择25行。

select rownum , a.* from (select * from product ORDER BY pro_info) a ;

select rownum , a.* from (select * from product ORDER BY pro_info) a where rownum<21;

两个语句得到的结果中 pro_info相同行,顺序不一样(红色部分)~

我觉得对于pro_info相同的行,返回的顺序应该是fetch的顺序,那么看执行计划

SORT ORDER BY     和 SORT ORDER BY  STOPKEY 这两种排序,是不是fetch 结果集的顺序不同呢?

[本帖最后由 zergduan 于 2009-11-20 15:59 编辑]

回答: 在Oracle中,DISTINCT和GROUP BY都可以用来去重,但它们在性能上有一些差异。根据测试结果,DISTINCT和GROUP BY的性能差距很小,不需要过于关注。然而,DISTINCT关键字是用来去重的,而GROUP BY则用于分组统计。因此,建议在需要去重的情况下使用DISTINCT,这样可以使SQL更易于理解。\[1\] 从执行计划上看,DISTINCT的操作是SORT (UNIQUE),而GROUP BY是SORT (GROUP BY)。DISTINCT操作只需要找出所有不同的值,而GROUP BY操作还需要为其他聚集函数进行准备工作。因此,从这个角度来看,GROUP BY操作的工作量应该比DISTINCT更大一些。\[2\] 然而,出乎意料的是,GROUP BY操作的COST更低,逻辑读也更少,这似乎与二者的工作量成反比。经过仔细观察执行计划,发现问题的根源在于GROUP BY使用了INDEX FULL SCAN,而DISTINCT使用了INDEX FAST FULL SCAN。在读取所有数据的情况下,索引快速全扫描的效率确实更高。但是由于这里采用了分页,只取前20条数据,并且Oracle的10g增加了GROUP BY STOPKEY这种新的执行路径,因此在这种情况下,GROUP BY操作的效率更高。\[3\] #### 引用[.reference_title] - *1* [Oracle中distinct和group by去重性能的比较](https://blog.csdn.net/weixin_41551276/article/details/106424179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [oracle中distinct和group by的区别](https://blog.csdn.net/WuLex/article/details/85335732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值