2013-05-17 2 views
-1

У меня есть запросОптимизация вложенных операторов выбора, чтобы уменьшить время выборки

select * from 
(select a.*, /*+ FIRST_ROWS(10) */ rownum rnum 
from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, TP.NAME, AL.EVENT, AL.FILE_NAME, 
       AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE, rownum 
     FROM AUDITLOG AL, 
      TRADINGPARTNER TP 
     WHERE (AL.LOG_SOURCE = 'File Deployment') AND TP.ID = AL.TP_ID 
     ORDER BY AL.EVENTDATE desc, AL.AL_UID desc 
    ) a 
where rownum < 101 
) 
where rnum > 0; 

Это занимает около одной минуты, чтобы принести результаты. пожалуйста, дайте мне знать, как оптимизировать его, чтобы сократить время получения. Могу ли я использовать соединения здесь?

+0

Какой результат вы действительно хотите? Вам нужны все столбцы? Если возможно, pls дают нам представление о желаемом выходе. – Dhwani

+0

Не могли бы вы иметь только один подзапрос, а не 2? «где rownum <101 и rnum> 0» должен делать трюк нет? – Ademar

+0

На самом деле, я не вижу необходимости в каких-либо подзапросах. Кроме того, индекс log_source, скорее всего, поможет. –

ответ

1

Индекс на (LOG_SOURCE, EVENTDATE desc, AL_UID desc) был бы стоит посмотреть - возможно, предложения desc не требуются и стараются не использовать их, если это возможно.

Я бы разместил подсказку first_rows в том же блоке запросов, что и предикат и порядок.

0

Функции окна часто бывают быстрее, чем order by. Вы можете попробовать это:

select * 
from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, TP.NAME, AL.EVENT, AL.FILE_NAME, 
      AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE, 
      ROW_NUMBER() over (order by AL.EVENTDATE desc, AL.AL_UID desc) as seqnum 
     FROM AUDITLOG AL join 
      TRADINGPARTNER TP 
      on TP.ID = AL.TP_ID 
     WHERE AL.LOG_SOURCE = 'File Deployment' 
    ) t 
where seqnum between 1 and 100; 

С этим, вы можете написать это как:

select al.*, TP.name 
from (SELECT AL.AL_UID, AL.TP_ID, AL.EVENTDATE, AL.EVENT, AL.FILE_NAME, 
      AL.NOTES, AL.XU_NAME, AL.STATUS, AL.LOG_SOURCE, 
      ROW_NUMBER() over (order by AL.EVENTDATE desc, AL.AL_UID desc) as seqnum 
     FROM AUDITLOG AL 
     WHERE AL.LOG_SOURCE = 'File Deployment' 
    ) al join 
    TradingPartner tp 
    on TP.ID = AL.TP_ID 
where seqnum between 1 and 100; 

Здесь ясно, что индекс AuditLog(Eventdate, AL_UID) позволит значительно улучшить производительность.

+0

Спасибо за объяснение. Добавление индекса в столбец EVENT_DATE в таблице Audit_Log сделало трюк. большое спасибо – user2393330

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