Database 选择需要较长时间的查询

Database 选择需要较长时间的查询,database,Database,我正在运行一个非常简单的查询,没有任何where子句。它是spool文件中的满表选择。查询生成spool文件需要15个小时。spool文件大小为15G 表号9G sga_最大尺寸-9G db_缓存大小-5G 共享池大小2G pga尺寸5G 表没有索引 查询如下: SET head OFF; SET feed OFF; spool /data13/reptest/rep.dat select LEA_DWH_REPAYSCH.EMI_NUM || '~' || LEA_DWH_R

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

  • 表号9G
  • sga_最大尺寸-9G
  • db_缓存大小-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
------------------------------------------------------------------------------------

.

所有这些concat
|
都需要时间,但从逻辑上讲,您只是将
~
放在简单的列值之间。要加快速度,请选择部分作为单独的列并转储到文件中,然后使用shell脚本将所有列分隔符替换为
~
。即

 select 
 LEA_DWH_REPAYSCH.EMI_NUM,
 LEA_DWH_REPAYSCH.FINNESS_ACCT_NUM,
 to_char(LEA_DWH_REPAYSCH.MISDATE,'dd/mm/yyyy'),
 ...
将输出转储到一个文件(就像我们现在可能正在做的那样),并使用类似于
sed
,例如(假设数据是用逗号转储的):

更好的方法是,将脚本更改为使用
~
作为列分隔符,这样可以避免使用可能出现在列值中的列分隔符(导致数据被sed命令损坏)

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