2013-02-15 4 views
2

Здесь ситуация, Im пытается сгенерировать отчет из моей базы данных Oracle, которая состоит из множества строк, у меня есть около 5 минут времени запроса прямо сейчас и хотелось бы посмотреть, есть ли способ изменить запрос, который может ускорить время запроса,Как ускорить этот SQL-запрос?

SELECT ib1.id as InvoiceNumber, 
ib1.shipmentno as ShipmentNumber, 
ib1.ref as ConsignorRef, 
cons1.name as ConsName, 
ib1.consolidation_type as ShipmentType, 
to_char(ib1.custom_field12, 'YYYYMMDDhhmmss') as InvoiceDate, 
ib1.reg_time as HousingDate, 
ib1.list_add_time as Pickup, 
ib1.confirm_date as Date, 
ex1.stat_date as Timestamp, 
ib1.date_prefered as ETA, 
ib1.field7 as Housing, 
ib1.countrycode as Country 
FROM Invoice ib1, 
    ek_export ex1, 
     ek_cons cons1 
WHERE ib1.ex_id=124 
AND ib1.id=ex1.ib_id 
AND ex1.state_type='DELIVERED' 
AND ib1.cons_id=cons1.id 
AND ex1.ex_id=124 
AND trunc(ib1.reg_time) BETWEEN to_date('2009-01-01', 'YYYY-MM-DD') AND to_date('2010-01-01', 'YYYY-MM-DD') 
ORDER BY ib1.id 

Любые советы?

+1

Попробуйте заменить 'trunc (ib1.reg_time)' только на 'ib1.reg_time'. –

+1

(Чтобы уточнить, если вы настроите свои ограничения на использование '<на следующий день',' TRUNC' не требуется) –

ответ

5

Вы должны проверить, что ваш запрос использует индексы.

Я думаю, вам придется индекс:

  • ex1.ib_id
  • ex1.state_type
  • ib1.cons_id
  • ex1.ex_id
  • ib1.reg_time

Дополнительно, избегайте использования функций в состоянии запроса, попробуйте прямо поместить результат func Тион

  • to_date ('2009-01-01', 'YYYY-MM-DD') заменяется результатом, если это возможно
  • TRUNC (ib1.reg_time), попытайтесь уже хранить "TRUNC" значение изд

Затем сделайте свое соединение, как сказано в ответе Инго, чтобы лучше контролировать ваши соединения.

И наконец, вы заказываете результаты по ib1.id, это необходимо? если нет, удалите предложение порядка.

Ознакомьтесь с этой документацией Oracle, это касается анализа запроса. http://docs.oracle.com/cd/B10500_01/server.920/a96533/ex_plan.htm

+0

Использование функции с постоянным значением или параметром, например 'to_date() ', это не проблема. Использование функции в столбце, например 'trunc()', является серьезной проблемой. –

+0

ok для to_date(), но я думаю, что это небольшая возможная оптимизация. – djleop

+1

Вы можете заменить это условие на 'AND (ib1.reg_time> = DATE'2009-01-01 'AND ib1.reg_time

0

есть 2 шаг запроса, сам запрос и выборка, я думаю, что выборка не может быть сжата. Можете ли вы сказать время каждого шага. (mysql-worbench дает обе информации)

+3

'mysql-workbench' также не работает с Oracle. –

0

ваш запрос сначала берет перекрестное соединение по всем таблицам, а затем фильтрует огромный результат в вашем предложении where ... используйте внутренние соединения, чтобы выбрать только те строки, которые имеют значение в первую очередь. .. как

... 
from invoice ib1 
join ek_export ex1 on ib1.id = ex1.ib_id 
join ek_cons cons1 on ib1.cons_id = cons1.id 
... 
+2

Это просто неправильно. Хотя по другим причинам полезно использовать явный синтаксис JOIN, он имеет значение нуль в отношении эффективности. –

+1

Согласен с ypercube здесь.Если у вас есть * очень плохой планировщик, я полагаю, что это может иметь значение, но с любым полуподобным планировщиком явное vs cross join и filter будут рассматриваться как эквивалентные. Поскольку это Oracle, мы можем это исключить. –

+0

согласился обоим вашим комментариям. в основном оптимизаторы rdbms обычно оптимизируют оба типа запросов к одному и тому же плану выполнения ... теоретически, если они не оптимизировали это, это изменило бы ситуацию, но, как вы указали, какие-либо основные rdbms должны в настоящее время должным образом позаботиться об этом вопросе – Ingo

2

Анализ результатов запроса. Вы можете посмотреть план выполнения, а также просмотреть индекс, созданный на каждой из участвующих таблиц.

Правило большого пальца состоит в том, что в столбцах, которые участвуют в предложении where и order by, должен быть указатель.

Другой подобный вопрос здесь: Making my SQL Query more efficient

+0

вопрос is about oracle – djleop

+1

@djleop: Я знаю, что это для Oracle. Однако базовые концепции одинаковы для любой СУБД. – Kangkan

+1

Вот документация о том, как анализировать запрос в oracle: http://docs.oracle.com/cd/B10500_01/server.920/a96533/ex_plan.htm – djleop

Смежные вопросы