Oracle多線程並行使用、關聯與指定索引執行


 

CREATE TABLE T_SMAINT_2016012703 parallel 4 nologging AS
SELECT /*+parallel(4) leading(s a) use_hash(A) index(s IDX_CS_SERVICE_RECORD_MD2_04) */S.SMAINT_ID, S.SMAINT_DESC
  FROM T_CS_SERVICE_RECORD S
  JOIN T_CD_MAINT A
    ON A.SMAINT_ID = S.SMAINT_ID
   AND S.SORG_ID = 'MDKT'
   AND A.SORG_ID = S.SORG_ID
   AND A.PROD_ID = 'KT'
   AND S.PUB_CREATE_DATE BETWEEN
       TO_DATE('2015-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND
       TO_DATE('2015-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss');
parallel 4 nologging:並行(Parallel)使用
/*+parallel(4) leading(s a) use_hash(A) index(s IDX_CS_SERVICE_RECORD_MD2_04) */
parallel(4):4個進程並行使用
leading(s a):指定表的查詢順序
先查s表,根據
S.PUB_CREATE_DATE條件走索引IDX_CS_SERVICE_RECORD_MD2_04查詢結果集,再用hash連接關聯a表。
哈希連接會耗費大量cup和內存,而嵌套循環則會少很多。
如上例子,如果使用嵌套循環,根據s表查詢結果集一行一行數據關聯a表循環查詢
使用leading和use_nl來設置表的查詢順序,來加快查詢速度,一般把小表設為第一個表。
/*+LEADING(TABLE)*/
  將指定的表作為連接次序中的首表.
/*+USE_NL(TABLE)*/
  將指定表與嵌套的連接的行源進行連接,並把指定表作為內部表.




1.查詢
Sql代碼  
SELECT /*+ Parallel(t,8) */ * FROM emp t;  
SELECT /*+ Parallel(8) */ * FROM emp t;  
SELECT /*+ Parallel */ * FROM emp t;         
 
2.創建索引
Sql代碼  
create index idx_emp_test on emp(empno,ename,job) nologging parallel 32;  
         創建索引的時候,如果有條件的話一定要加並行!客戶這邊的ExaData服務器,對運單表(5000多萬記錄,90多個字段,60多G數據)創建索引,索引字段包含6列,並行度開到64,創建索引耗時竟然只消耗13秒多點,把俺驚訝的……

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM