2011-07-06 106 views
0

我正在運行一個非常簡單的查詢而沒有任何where子句。它是假脫機文件中的全表選擇。查詢需要15個小時才能生成假脫機文件。假脫機文件大小是15G。選擇查詢需要很長時間

  • 表大小9G
  • SGA_MAX_SIZE-9G
  • db_cache大小 - 5G
  • 共享池的大小2G
  • PGA大小5G
  • 表都沒有索引 查詢如下:

    SET head OFF; 
    SET feed OFF; 
    spool /data13/reptest/rep.dat 
    
    select 
    LEA_DWH_REPAYSCH.EMI_NUM || '~' || 
    LEA_DWH_REPAYSCH.FINNESS_ACCT_NUM|| '~' || 
    to_char(LEA_DWH_REPAYSCH.MISDATE,'dd/mm/yyyy')|| '~' || 
    LEA_DWH_REPAYSCH.PRINCOMP|| '~' || 
    LEA_DWH_REPAYSCH.INTCOMP|| '~' || 
    LEA_DWH_REPAYSCH.EXINTCOMP|| '~' || 
    LEA_DWH_REPAYSCH.EMI_AMT|| '~' || 
    LEA_DWH_REPAYSCH.INTCOMP_RECD|| '~' || 
    LEA_DWH_REPAYSCH.PRINCOMP_RECD|| '~' || 
    LEA_DWH_REPAYSCH.TOTAL_RECDAMT|| '~' || 
    LEA_DWH_REPAYSCH.EXINTCOMP_RECD|| '~' || 
    LEA_DWH_REPAYSCH.BILLFLAGE|| '~' || 
    LEA_DWH_REPAYSCH.ADVFLAG|| '~' || 
    to_char(LEA_DWH_REPAYSCH.DUEDATE,'dd/mm/yyyy')|| '~' || 
    to_char(LEA_DWH_REPAYSCH.BILLEDDATE,'dd/mm/yyyy')|| '~' || 
    to_char(LEA_DWH_REPAYSCH.PAYMENTDATE,'dd/mm/yyyy')|| '~' || 
    LEA_DWH_REPAYSCH.OVERDUE_AMT|| '~' || 
    to_char(LEA_DWH_REPAYSCH.OVERDUE_DATE,'dd/mm/yyyy') 
    from FIN_LEA.LEA_DWH_REPAYSCH; 
    spool off; 
    

*查詢執行計劃 計劃哈希值:2170819202

------------------------------------------------------------------------------------ 
| Id | Operation   | Name    | Rows | Bytes | Cost (%CPU)| Time 
------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT |     |  1 | 192 |  4 (25)| 00:00:01 
| 1 | TABLE ACCESS FULL | LEA_DWH_REPAYSCH |  1 | 192 |  4 (25)| 00:00:01 
------------------------------------------------------------------------------------ 

回答

0

所有這些concats ||是花費時間,但邏輯上,你只是簡單的列值之間~。爲了加快速度,請選擇部件作爲單獨的列並轉儲到文件,然後使用shell腳本將所有列分隔符替換爲~。即

select 
LEA_DWH_REPAYSCH.EMI_NUM, 
LEA_DWH_REPAYSCH.FINNESS_ACCT_NUM, 
to_char(LEA_DWH_REPAYSCH.MISDATE,'dd/mm/yyyy'), 
... 

轉儲輸出到文件(很可能現在做的),並使用類似sed,例如(假設數據是用逗號傾倒):

sed -i '' -e 's/,/~/g' /data13/reptest/rep.dat 

更妙的是,將腳本更改爲使用~作爲列分隔符字符,這樣可避免使用可能出現在列值中的列分隔符(導致數據被sed命令損壞)