Как настроить это представление? Время получения занимает 9,968, но я хочу в .5.так как дать лучшую производительность - PullRequest
0 голосов
/ 11 марта 2011
SELECT
/*+ INDEX(ID_BL_REF_NO REF_number_BL_idx*/ DECODE(BL_TYPE,'E',BL_ORIGIN_NAME,'I',BL_FINAL_NAME) FROM_PORT,
 DECODE(BL_TYPE,'I',BL_ORIGIN_NAME,'E',BL_FINAL_NAME) TO_PORT,
(BL_VESSEL_CONNECT||'/'||BL_VOYAGE_CONNECT||'/'||BL_PORT_CONNECT) Mother_vessel_voyage_port,
SUM(BLC_SIZE) No_of_20s,
SUM(BLC_SIZE)  No_of_40s,
SUM(DECODE(BLC_SIZE,'20',1,'40',2)) Teus,
SUM(BLC_GROSSWT) GrossWt,
round((BLC_GROSSWT/SUM(DECODE(BLC_SIZE,'20',1,'40',2))),2) AverageWt,
SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)) PREPAID,
SUM(DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)) COLLECT,
SUM(DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT)) ELSEWHERE,
(SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT))/SUM(DECODE(BLC_SIZE,'20',1,'40',2))) AVERAGE
FROM ID_BL_DETAILS,id_bl_containers,ID_BL_FREIGHT
WHERE BL_REFNO=BLC_REFNO
AND BLF_REFNO=BLC_REFNO
GROUP BY BL_VESSEL_CONNECT,BL_VOYAGE_CONNECT,BL_PORT_CONNECT,BL_ORIGIN_NAME,BL_LODPORT,BL_DISPORT,BL_FINAL_NAME,BLC_GROSSWT,BL_TYPE

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Ваше предложение WHERE содержит только объединения. Там нет фильтров. Это означает, что ваш запрос должен учитывать все строки хотя бы в одной таблице. Из этого следует, что ваш запрос должен выполнить ПОЛНОЕ СКАНИРОВАНИЕ ТАБЛИЦЫ хотя бы одной из ваших таблиц, а не индексированное чтение. Полное сканирование таблицы является наиболее эффективным способом получения всех строк в таблице.

Так что не исправляйте синтаксис подсказки INDEX, избавьтесь от нее.

Затем выясните, какая таблица должна управлять вашим запросом. Это бизнес логика. Вероятно, ваше требование что-то вроде

"Подведите итог BL_DETAILS и BL_FREIGHT для каждой строки в BL_CONTAINERS. "

В этом случае вы можете подумать, что вам нужно полное сканирование таблицы BL_CONTAINERS. Но если BL_FREIGHT имеет больше строк, чем BL_CONTAINERS, и каждый BLF_REF_NO соответствует BL_REF_NO (т. Е. Существует внешний ключ на BL_FREIGHT.BLF_REF_NO, ссылающийся на BL_CONTAINERS.BL_REF_NO), вероятно, было бы лучше перейти из BL_FREIGHT.

Обратите внимание, что это верно, если вас интересуют только BL_CONTAINERS, которые имеют соответствующие строки BL_FREIGHT. Но если вы хотите включить контейнеры, которые не использовались (т. Е. Они не соответствуют ни одной записи BL_FREIGHT), вам необходимо использовать внешние объединения и удалить таблицу BL_CONTAINERS.

Эти соображения усложняются, когда вы добавляете BL_DETAILS в микс. Похоже, что ваш отчет основан на категориях BL_DETAILS (как заметил Джеффри, нам трудно понять ваш запрос без псевдонимов или описаний). Так что, возможно, BL_DETAILS - правильный кандидат для вождения стола.

Как видите, настройка требует понимания бизнес-логики и деталей модели данных. У вас есть местные знания, а у нас нет.

Есть инструменты, которые могут вам помочь. Oracle имеет EXPLAIN PLAN, который покажет вам, как база данных будет выполнять запрос. Оптимизатор запросов становится лучше с каждым выпуском, поэтому важно, какую версию базы данных вы используете. Вот документация для 10g .

Важно отметить, что вам нужно предоставить базе данных точную статистику, чтобы она могла составить хороший план. Узнайте больше.

2 голосов
/ 11 марта 2011

Ваш вопрос утверждает, что запрос занимает 9,968 секунд, и вы хотите, чтобы он был 0,5 секунд или меньше.Это можно сделать эффективно (если вообще возможно), когда вы знаете, на что тратятся эти 9,968 секунд.И чтобы узнать, на что тратится время в запросе, вам нужно не только объяснить оператор, но и проследить выполнение этого запроса.Последнее даст вам представление о том, как тратится время в вашем запросе.

В OTN есть две нити, описывающие, как вы можете это сделать.

Если вы хотите выполнить все необходимоеминимум, пожалуйста, следуйте этому: http://forums.oracle.com/forums/thread.jspa?messageID=1812597

И если вы хотите дать полную информацию, пожалуйста, следуйте этому: http://forums.oracle.com/forums/thread.jspa?threadID=863295

Счастливого отслеживания!

С уважением,
Роб.

2 голосов
/ 11 марта 2011

запустите explain по вашему запросу и убедитесь, что установлены правильные индексы. Улучшит скорость запроса

http://www.sql.org/sql-database/postgresql/manual/sql-explain.html

...