2016-10-28 4 views
0

Ниже запроса выполняется время (2,37 секунды). У меня приблизительно 5,00,00 записей и 2,00,00 записей в таблицах FORWARD_INFO и G_PROFILE соответственно.Требуется оптимизация запросов Oracle (прошедшее время = 2,37 с)

Мне нужно оптимизировать этот запрос. Это займет ~ .20 сек. Можете ли вы предложить.

Использование Oracle10g DB.

SELECT S_NUM, STATUS, TRANSLATION_NUM, ANN, NOTIFY_ANN, ID, NAME, 
    PROFILE_ID, ANN_ID, RES_PROFILE_ID, R_ANN, RES_ANN_ID 
FROM(
    SELECT CSC.S_NUM,CSC.STATUS, CSC.TRANSLATION_NUM, CSC.ANN, CSC.NOTIFY_ANN, CSC.ID, CGP.NAME, CGP.PROFILE_ID, CGP.ANN_ID, CGP.RES_PROFILE_ID, CGP.R_ANN, CGP.RES_ANN_ID, 
    RANK() OVER(ORDER BY LENGTH(CSC.S_NUM) DESC) RANKING 
    FROM 
    FORWARD_INFO CSC, G_PROFILE CGP 
    WHERE '0120913005' LIKE CSC.S_NUM||'%' AND 
     CGP.NAME LIKE 'ase' ||'%' AND 
     CSC.ACCOUNT_NUMBER=10 AND CSC.ID= CGP.ID AND 
     CSC.ACTIVE = 1 AND CGP.ACTIVE = 1) 
WHERE RANKING = 1 AND 
     ROWNUM = 1; 
+0

Я не думаю, что кто-нибудь мог бы помочь без по крайней мере DDL таблиц и индексов и базового понимания данных, содержащихся в таблицах, и логики запроса. – Insac

+0

Пожалуйста, отредактируйте свой вопрос, добавьте инструкции 'create table' для рассматриваемых таблиц (включая все индексы) и план выполнения. [** Отформатированный текст **] (http://stackoverflow.com/editing-help#code), пожалуйста, [без скриншотов] (http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557) –

ответ

-3

В ИНЕКЕ

WHERE '0120913005' LIKE 
    CSC.S_NUM||'%' AND CGP.NAME LIKE 'ase' ||'%' AND 
    CSC.ACCOUNT_NUMBER=10 AND CSC.ID= CGP.ID AND 
    CSC.ACTIVE = 1 AND CGP.ACTIVE = 1 

изменить порядок условий, как этот

WHERE CSC.ACTIVE = 1 AND CGP.ACTIVE = 1 AND 
    CSC.ACCOUNT_NUMBER=10 AND CSC.ID= CGP.ID AND 
'0120913005' LIKE 
    CSC.S_NUM||'%' AND CGP.NAME LIKE 'ase' ||'%' 

сравнения строк занимает много затрат

+0

Порядок условий WHERE не соответствует. Оптимизатор может все равно переустановить их. –

+0

Поскольку оракул оптимизирован на основе затрат, он самостоятельно организует заказ – NzGuy

0

После немного переформатирования

SELECT S_NUM, STATUS, TRANSLATION_NUM, 
    ANN, NOTIFY_ANN, ID, NAME, 
    PROFILE_ID, ANN_ID, RES_PROFILE_ID , R_ANN, 
    RES_ANN_ID 
FROM 
    (SELECT CSC.S_NUM,CSC.STATUS, CSC.TRANSLATION_NUM, CSC.ANN, CSC.NOTIFY_ANN, CSC.ID, 
     CGP.NAME, CGP.PROFILE_ID, CGP.ANN_ID, CGP.RES_PROFILE_ID , CGP.R_ANN, CGP.RES_ANN_ID, 
     RANK() OVER (ORDER BY LENGTH(CSC.S_NUM) DESC) RANKING 
    FROM FORWARD_INFO CSC 
     JOIN G_PROFILE CGP ON CSC.ID = CGP.ID 
    WHERE '0120913005' LIKE CSC.S_NUM||'%' 
     AND CGP.NAME LIKE 'ase' ||'%' 
     AND CSC.ACCOUNT_NUMBER = 10   
     AND CSC.ACTIVE = 1 
     AND CGP.ACTIVE = 1) 
WHERE RANKING = 1 
    AND ROWNUM = 1; 

вы видите узкое место:

'0120913005' LIKE CSC.S_NUM||'%' AND CGP.NAME LIKE 'ase' ||'%' 

Вы можете создать на базе функций-индексов.

CREATE INDEX NAME_LIKE_ASE ON G_PROFILE (SUBSTR(NAME, 1, 3)); 
CREATE INDEX S_NUM_LIKE ON G_PROFILE (S_NUM||'%'); 

Ваш ГДЕ обусловливающих будет

'0120913005' LIKE CSC.S_NUM||'%' AND SUBSTR(NAME, 1, 3) = 'ase' 

Тогда вы должны иметь индексы на FORWARD_INFO.ID и G_PROFILE.ID.

+0

Не должен ли быть создан индекс S_NUM_LIKE на FORWARD_INFO, а не G_PROFILE? Кроме того, вероятно, это поможет включить другие столбцы в предикаты в fbi слишком – Boneist

+0

Но в целом, хотя ваш совет - хороший совет, у нас все еще нет всей информации. Каковы наиболее избирательные критерии? На нем уже есть индекс? Что, если (например) два индекса не являются выборочными вообще, а ОП просто хочет несколько «активных» записей на большинстве «неактивных»? Решение может быть снова FBI, но в активном столбце. Таким образом, OP действительно должен дать нам больше информации, если он хочет, чтобы мы помогли ему достичь 10-кратного прироста производительности. – Insac