选择查询需要很长时间

时间:2011-07-06 09:49:34

标签: database

我正在运行一个非常简单的查询而没有任何where子句。它是假脱机文件中的全表选择。查询需要15个小时才能生成假脱机文件。假脱机文件大小为15G。

  • 表格大小9G
  • SGA_MAX_SIZE-9G
  • db_cache size-5G
  • 共享池大小2G
  • pga size 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
------------------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:0)

所有这些联接||正在花费时间,但从逻辑上讲,您只是将~放在简单的列值之间。要加快速度,请将这些部分选择为单独的列并转储到文件,然后使用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命令损坏)