2016-10-20 4 views
0

Я пытаюсь улучшить запрос. У меня есть набор данных, открытый для билетов. Каждый билет имеет разные строки, каждая строка содержит обновление билета. Существует поле (dt_update), которое отличает его от каждой строки.Настройка Oracle для запроса с запросом annidate

У меня есть эти индексы в st_remedy_full_light.
IDX_ASSIGNMENT (ПЕРЕДАЧА)
IDX_REMEDY_INC_ID (REMEDY_INC_ID)
IDX_REMDULL_LIGHT_DTUPD (DT_UPDATE)

Теперь, запрос выполняется в 8 секунд. Является высокой для меня.

WITH last_ticket AS 
    (SELECT * 
    FROM st_remedy_full_light a 
    WHERE a.dt_update IN 
    (SELECT MAX(dt_update) 
     FROM st_remedy_full_light 
     WHERE remedy_inc_id = a.remedy_inc_id 
    ) 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 

Это план Explain Plan Как я мог улучшить этот запрос?

P.S. Это только часть большого запроса

Дополнительная информация: - таблица st_remedy_full_light содержит 529.507 строк

+0

Может быть несколько 'st_remedy_full_light' с тем же 'dt_update' per 'remedy_inc_id'? –

+0

указатель на (remedy_inc_id, dt_update) - или, возможно, даже (remedy_inc_id, dt_update, присваивание) - должен помочь вам, если вы не хотите/не можете изменить подзапрос на то, что предлагает Тони Эндрюс. То есть один индекс, содержащий несколько столбцов, а не индекс для каждого столбца - Oracle сможет использовать только один из этих индексов столбцов для запроса, он не может использовать все три, даже если вы используете все три столбца в своем запрос. Такой индекс, вероятно, также поможет предложенному Тони Эндрю запросу. – Boneist

+0

@EvgeniyK. не только remedy_inc_id имеют больше dt_update, но не другие. – vecio88

ответ

2

Вы можете попробовать:

WITH last_ticket AS 
    (SELECT remedy_inc_id, ASSIGNMENT, 
      rank() over (partition by remedy_inc_id order by dt_update desc) rn 
    FROM st_remedy_full_light a 
) 
SELECT remedy_inc_id, ASSIGNMENT FROM last_ticket 
where rn = 1; 
+0

Привет, Tony, спасибо за ваш ответ ... К сожалению, я использовал это решение, но странно медленнее моего решения. – vecio88

+0

Не могли бы вы поделиться более подробной информацией о том, почему этот запрос будет работать быстро по сравнению с оригинальным. – NzGuy

+0

@NzGuy Я бы _expect_ это для _probably_ запускать быстрее, потому что ему не нужно хешировать join 'last_ticket' самому себе. –

1

Лучший альтернативный запрос, который также является гораздо проще выполнить, заключается в следующем:

select remedy_inc_id 
    , max(assignment) keep (dense_rank last order by dt_update) 
    from st_remedy_full_light 
group by remedy_inc_id 

Это будет использовать только один полный просмотр таблицы и (хэш/сортировки) группу по, не само не присоединяется.

Не беспокойтесь об индексированном доступе, так как вы, вероятно, найдете полное сканирование таблицы, наиболее уместно здесь. Если таблица действительно невелика, а составной индекс для всех используемых колонок (remedy_inc_id, dt_update, назначение) будет значительно быстрее читать, чем таблица.

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

  • Нет связанных вопросов^_^