成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

oracle并行查詢一列的實現

數據庫 Oracle
在使用oracle數據庫的過程中,有時會遇到SQL執行時間過長的問題,下文中使用oracle并行查詢的方法,輕松解決了該問題。

在oracle數據庫中碰到SQL執行時間過長。根本無法得到結果集的問題。服務器壓力也沒有很高,估計又是一個非常消耗磁盤的查詢。通過oracle并行查詢一列的方法,解決了這個問題。

果然,發現是一個200w的表和一個超過1100w表的HASH JOIN .
簡單的幫助優化了一個SQL后,SQL如下:

  1.     select     count(ui.usin_uid_fk)  
  2.      from table1 av, table2 ui  
  3. where av.av_usse_activatedate >= to_date('20090102', 'yyyymmdd')  
  4.      and av.av_usse_activatedate < to_date('20090401', 'yyyymmdd')  
  5.      and av.av_usse_uid_fk = ui.usin_uid_fk  
  6.      and ui.usin_mcnc_fk =XXX%' 

不難想象執行的不是很理想。近20分鐘的執行時間,真是讓人崩潰。

  1. COUNT(UI.USIN_UID_FK)  
  2. ---------------------  
  3.  1918591  
  4.  
  5. Elapsed: 00:19:03.07  
  6. Statistics  
  7. ----------------------------------------------------------  
  8. 0     recursive calls  
  9. 0     db block gets  
  10.      32921639     consistent gets  
  11.   352073     physical reads  
  12. 0     redo size  
  13.    395     bytes sent via SQL*Net to client  
  14.    503     bytes received via SQL*Net from client  
  15. 2     SQL*Net roundtrips to/from client  
  16. 0     sorts (memory)  
  17. 0     sorts (disk)  
  18. 1     rows processed  

對于那張TABLE2的大表(符合條件的超過1100w),決定試圖通過并行來提高執行速度。SQL如下:

  1. select /*+parallel (tbl_userinfo 4)*/ count(ui.usin_uid_fk)  
  2. from table1 av, table2 ui  
  3. where av.av_usse_activatedate >= to_date('20090101', 'yyyymmdd')  
  4. and av.av_usse_activatedate < to_date('20090401', 'yyyymmdd')  
  5. and av.av_usse_uid_fk = ui.usin_uid_fk  
  6. and ui.usin_mcnc_fk like 'XXX%'; 

執行效果還是非常明顯的。從19分鐘多到1分45秒!其中consistent gets更是減少了一個數量級。
    

  1.  COUNT(UI.USIN_UID_FK)  
  2. ---------------------  
  3.  1918591  
  4.  
  5. Elapsed: 00:01:45.15  
  6.  
  7. Statistics  
  8. ----------------------------------------------------------  
  9. 0     recursive calls  
  10. 0     db block gets  
  11.  2571109     consistent gets  
  12.   124523     physical reads  
  13. 0     redo size  
  14.    395     bytes sent via SQL*Net to client  
  15.    504     bytes received via SQL*Net from client  
  16. 2     SQL*Net roundtrips to/from client  
  17. 0     sorts (memory)  
  18. 0     sorts (disk)  
  19. 1     rows processed  

因為這個服務器為2×4核心的cpu,應該可以算是8個CPU,所以應該可以通過增加并行度來進一步減少執行時間。如下SQL:

  1.     SQL> select /*+parallel (tbl_userinfo 8)*/ count(ui.usin_uid_fk)  
  2.      2  from table1 av, table2 ui  
  3.      3     where av.av_usse_activatedate >= to_date('20090101', 'yyyymmdd')  
  4.      4  and av.av_usse_activatedate < to_date('20090401', 'yyyymmdd')  
  5.      5  and av.av_usse_uid_fk = ui.usin_uid_fk  
  6.      6  and ui.usin_mcnc_fk like '460%';  
  7.  
  8. COUNT(UI.USIN_UID_FK)  
  9. ---------------------  
  10.  1949033  
  11.  
  12. Elapsed: 00:00:20.60  
  13.  
  14. Statistics  
  15. ----------------------------------------------------------  
  16. 0     recursive calls  
  17. 0     db block gets  
  18.   2607524     consistent gets  
  19.       55050     physical reads  
  20. 0     redo size  
  21.    395     bytes sent via SQL*Net to client  
  22.    503     bytes received via SQL*Net from client  
  23. 2     SQL*Net roundtrips to/from client  
  24. 0     sorts (memory)  
  25. 0     sorts (disk)  
  26. 1     rows processed  


可以說還是比較理想的。只有20S左右了。雖然最大并行度可以到CPU*2,但是效果未必會好。進一步做一個16個并行度的SQL執行測試。

  1.       COUNT(UI.USIN_UID_FK)  
  2. ---------------------  
  3.  1949033  
  4.  
  5. Elapsed: 00:00:20.64  
  6.  
  7. Statistics  
  8. ----------------------------------------------------------  
  9. 0     recursive calls  
  10. 0     db block gets  
  11.  2607524     consistent gets  
  12.       55299     physical reads  
  13. 0     redo size  
  14.    395     bytes sent via SQL*Net to client  
  15.    504     bytes received via SQL*Net from client  
  16. 2     SQL*Net roundtrips to/from client  
  17. 0     sorts (memory)  
  18. 0     sorts (disk)  
  19. 1     rows processed        
  20.  

沒有任何提高,并且執行時間還稍高于并行度為8的SQL。

通過以上測試我們不難發現:

在處理大量數據查詢,例如出現HASH JOIN的情況下,oracle并行非常有效果的。也就是說并行查詢在數據倉庫這樣的應用中會“大顯身手”。

但是oracle并行的使用還是有很多限制的。例如相對較小的數據查詢和連接是會適得其反的。盲目增加并行度也是大忌,相對來講,并行度和CPU數相同比較好。這里的CPU數應該是指的核心數。例如服務器中有一個CPU是4核心的,并行度為4是好的。

技術很難有十全十美的,最重要的是對于特定技術的使用要恰到好處,保證揚長避短。
 

 

 

 

【編輯推薦】

ORACLE ROWNUM語句的使用

Oracle索引的類型

創建Oracle索引的方法

C#連接Oracle數據庫查詢數據

使用oracle存儲過程分頁的實例

責任編輯:段燃 來源: 互聯網
相關推薦

2010-10-27 13:54:18

Oracle并行查詢

2021-01-21 15:44:03

vlookup函數數據區域Match函數

2010-10-27 13:35:15

Oracle查詢

2010-10-29 16:41:12

Oracle模糊查詢

2010-10-27 17:00:32

oracle樹查詢

2010-10-27 16:39:23

oracle查詢

2010-10-28 16:52:11

oracle多列子查詢

2010-09-28 09:49:48

SQL字符串

2016-12-16 19:13:33

擴展性數據庫

2010-11-16 14:15:16

oracle標識列

2010-10-27 14:41:45

Oracle查詢用戶表

2017-07-17 15:46:20

Oracle并行機制

2022-02-17 11:03:06

MySQL組件查詢

2010-04-09 14:48:41

Oracle數據庫

2022-04-09 09:11:33

Python

2010-04-14 15:22:21

Oracle自動

2015-07-20 17:17:41

SQL Server

2010-09-10 13:37:59

SQLCOUNT()函數

2009-07-28 08:36:45

TemplateFie

2010-11-18 16:27:37

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人亚洲精品久久久久软件 | 亚洲一区二区在线 | 色婷婷婷婷色 | 中文字幕综合 | 日韩精品在线观看一区二区三区 | 国产成人久久精品 | 日日骚网 | 国产精品久久久久久久免费观看 | 超碰人人艹 | 毛片99| 日日骚视频 | 欧美精品一区二区三区在线 | 又黑又粗又长的欧美一区 | 91精品国产综合久久久久久丝袜 | 国产人免费人成免费视频 | 国产一区免费视频 | 免费中文字幕 | 成人国产精品免费观看 | 久久aⅴ乱码一区二区三区 91综合网 | 免费精品视频在线观看 | 欧美性tv| 欧美日本一区二区 | 久www | 日韩欧美在线视频播放 | 国产免费观看一级国产 | 91天堂网 | 国产精品亚洲一区 | 亚洲欧美日韩中文在线 | 亚洲天堂色 | 999久久 | 国产精品69毛片高清亚洲 | 成人在线视频免费播放 | 久青草影院 | 日韩视频在线免费观看 | 欧美精品网站 | 国产真实乱全部视频 | 国产精品99久久久久久久vr | 欧美性猛交一区二区三区精品 | 九九久久国产 | 久久精品色欧美aⅴ一区二区 | 懂色中文一区二区在线播放 |