| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > Как оптимизировать запрос |
| Автор: Elnarka 29.4.2008, 08:31 | ||||
Здравствуйте.У меня есть вот такой запрос:
Никак не выполняется. План таков.
Вобще.Где можно получить хорошую информацию про оптимизацию?Несовсем понимаю |
| Автор: DimW 29.4.2008, 09:30 | ||
| 1) дайте информацию о количестве строк в каждой из таблиц: dwh.fct_charge_prc dwh.con_ass_contr_acc dwh.det_contracts dwh.con_ass_acc dwh.det_ord_liab dwh.det_source 2) сколько строк возвращает этот селест:
3) вы принципиально используете ansi синтаксис (join)? можно увидеть план запроса без использования join?! |
| Автор: Elnarka 29.4.2008, 10:10 | ||||
| dwh.fct_charge_prc - около 4 млн dwh.con_ass_contr_acc - около 4 млн dwh.det_contracts - 2 млн dwh.con_ass_acc - 4 млн dwh.det_ord_liab - 1 млн dwh.det_source - 100 записей Запрос возврашает около 2000 записей Без использования join
Добавлено @ 10:12 Запрос соответствующий последнему плану таков
|
| Автор: DimW 29.4.2008, 11:09 | ||
Elnarka, покажи план этого запроса:
именно этого! и за какое время он выполняется? есть подозрение что во всем виноват distinct который приводит к сортировке подселекта. Добавлено через 5 минут и 34 секунды да и трассировку посмотреть бы не мешало. возможно слишком много дисковых чтений. |
| Автор: Elnarka 29.4.2008, 12:39 |
| План вашего запроса таков SELECT STATEMENT, GOAL = CHOOSE Cost=139 Cardinality=1 Bytes=159 SORT AGGREGATE Cardinality=1 Bytes=159 MERGE JOIN CARTESIAN Cost=139 Cardinality=23 Bytes=3657 NESTED LOOPS Cost=11 Cardinality=1 Bytes=137 NESTED LOOPS Cost=9 Cardinality=1 Bytes=118 NESTED LOOPS Cost=7 Cardinality=1 Bytes=74 NESTED LOOPS Cost=6 Cardinality=1 Bytes=61 TABLE ACCESS BY INDEX ROWID Object name=CON_ASS_CONTR_ACC Cost=5 Cardinality=1 Bytes=33 INDEX RANGE SCAN Object name=AK_ASS_CONTR Cost=3 Cardinality=1 TABLE ACCESS BY INDEX ROWID Object owner=DWH Object name=DET_CONTRACTS Cost=1 Cardinality=1 Bytes=28 INDEX UNIQUE SCAN Object name=PK_DET_CONTRACTS Cardinality=1 TABLE ACCESS BY INDEX ROWID Object name=DET_SOURCE Cost=1 Cardinality=1 Bytes=13 INDEX UNIQUE SCAN Object name=PK_DET_SOURCE Cardinality=1 TABLE ACCESS BY GLOBAL INDEX ROWID Object name=FCT_CHARGE_PRC Cost=2 Cardinality=1 Bytes=44 INDEX RANGE SCAN Object name=AK_CHARGE_PRC_FCT_CHAR Cost=1 Cardinality=15 TABLE ACCESS BY INDEX ROWID Object name=DET_ORD_LIAB Cost=2 Cardinality=1 Bytes=19 INDEX UNIQUE SCAN Object name=PK_DET_ORD_LIAB Cost=1 Cardinality=1 BUFFER SORT Cost=137 Cardinality=215 Bytes=4730 TABLE ACCESS BY INDEX ROWID Object name=CON_ASS_ACC Cost=128 Cardinality=215 Bytes=4730 INDEX RANGE SCAN Object name=RELATION_11401_FK Cost=2 Cardinality=215 выполнился за 1810.953 ыулгтв Извините(простите за такой вопрос),а как трассировку посмотреть? )) |
| Автор: DimW 29.4.2008, 14:38 | ||||||||
да, очень долго. без трассировки дальнейшие попытки не имеют смысла. попытаюсь объяснить. все действия делаются в одной сесии! 1) включаем трассировку:
2) выполняешь свой запрос, и ждешь окончания результата. 3) выполняешь след. запрос чтобы получить путь и имя твоего файла с тарссировкой:
это путь к файлу на сервере БД 4) закрываешь трассировку:
и так ты получишь файл трассироки, но для его изучения необходимо еще предпринять пару шагов. в ORACLE_HOME\BIN есть програмулина tkprof.exe при помощи нее можно получить читабельный файл оформив батник такова вида:
trc_report.prt это файлик который будет создан после выполнения этого батника. его то и следует изучить. надеюсь объяснил доходчиво. |