2011-07-06 332 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命令损坏)