日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle查询排序速度慢,Oracle-请问Oracle SQL排序查询慢如何解决

發布時間:2023/12/2 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle查询排序速度慢,Oracle-请问Oracle SQL排序查询慢如何解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個原因很簡單:

SELECT * FROM(SELECT T.*,ROWNUM RN FROM(

SELECT * FROM INFO ORDER BY PDATE DESC

) T WHERE ROWNUM<2001) WHERE RN>0

算一下,如果使用定義在PDATE上的索引,那么拿到這2000個rowid后,還需要做2000次random io去讀取這2000條記錄。 -- 實在不如直接讀出所有記錄來做排序,成本還小的多。

改為:

SELECT B.id, B.created, T.RN FROM

big_table B

join

(SELECT created,ROWNUM RN FROM (SELECT created FROM big_table ORDER BY created DESC) WHERE ROWNUM<2000) T

on B.created=T.created

WHERE RN>0;

則會使用定義在PDATE上的索引來取最大的2000個PDATE,無需 排序。

下面的實驗是 用了我自己建的表,10w條數據。沒看出效果。。。,不過第一個select需要排序,第二個不需要。

SQL> SELECT * FROM

2 (SELECT T.*,ROWNUM RN FROM (SELECT id,created FROM big_table ORDER BY created DESC) T WHERE ROWNUM<2000)

3 WHERE RN>0 and rownum>1;

Plan hash value: 2610743403

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 1999 | 69965 | | 881 (2)| 00:00:11 |

| 1 | COUNT | | | | | | |

|* 2 | FILTER | | | | | | |

|* 3 | VIEW | | 1999 | 69965 | | 881 (2)| 00:00:11 |

|* 4 | COUNT STOPKEY | | | | | | |

| 5 | VIEW | | 98883 | 2124K| | 881 (2)| 00:00:11 |

|* 6 | SORT ORDER BY STOPKEY| | 98883 | 1255K| 2336K| 881 (2)| 00:00:11 |

| 7 | TABLE ACCESS FULL | BIG_TABLE | 98883 | 1255K| | 406 (1)| 00:00:05 |

Predicate Information (identified by operation id):

2 - filter(ROWNUM>1)

3 - filter("RN">0)

4 - filter(ROWNUM<2000)

6 - filter(ROWNUM<2000)

1 recursive calls

0 db block gets

1488 consistent gets

0 physical reads

0 redo size

471 bytes sent via SQL*Net to client

512 bytes received via SQL*Net from client

1 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

0 rows processed

SQL> SELECT B.*, T.RN FROM

2 big_table B

3 join

4 (SELECT created,ROWNUM RN FROM (SELECT created FROM big_table ORDER BY created DESC) WHERE ROWNUM<2000) T

5 on B.created=T.created

6 WHERE RN>0 and rownum>1;

Plan hash value: 1806601054

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 364K| 42M| 678 (2)| 00:00:09 |

| 1 | COUNT | | | | | |

|* 2 | FILTER | | | | | |

|* 3 | HASH JOIN | | 364K| 42M| 678 (2)| 00:00:09 |

|* 4 | VIEW | | 1999 | 41979 | 268 (1)| 00:00:04 |

|* 5 | COUNT STOPKEY | | | | | |

| 6 | VIEW | | 98883 | 772K| 268 (1)| 00:00:04 |

| 7 | INDEX FULL SCAN DESCENDING| INX | 98883 | 772K| 268 (1)| 00:00:04 |

| 8 | TABLE ACCESS FULL | BIG_TABLE | 98883 | 9849K| 407 (1)| 00:00:05 |

Predicate Information (identified by operation id):

2 - filter(ROWNUM>1)

3 - access("B"."CREATED"="T"."CREATED")

4 - filter("T"."RN">0)

5 - filter(ROWNUM<2000)

0 recursive calls

0 db block gets

1495 consistent gets

0 physical reads

0 redo size

1479 bytes sent via SQL*Net to client

512 bytes received via SQL*Net from client

1 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

0 rows processed

總結

以上是生活随笔為你收集整理的oracle查询排序速度慢,Oracle-请问Oracle SQL排序查询慢如何解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。