Database 选择需要较长时间的查询
我正在运行一个非常简单的查询,没有任何where子句。它是spool文件中的满表选择。查询生成spool文件需要15个小时。spool文件大小为15GDatabase 选择需要较长时间的查询,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
- 表号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;
------------------------------------------------------------------------------------
| 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