выберите запрос, занимающий много времени - PullRequest
0 голосов
/ 06 июля 2011

Я выполняю очень простой запрос без предложения 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
------------------------------------------------------------------------------------

.

1 Ответ

0 голосов
/ 06 июля 2011

Все эти конкататы || - это то, что отнимает время, но логически вы просто помещаете ~ между простыми значениями столбцов. Чтобы ускорить его, выберите части в виде отдельных столбцов и дамп в файл, а затем используйте сценарий оболочки, чтобы заменить все разделители столбцов на ~. т.е.

 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...