2012-06-28 2 views
0

Это запрос, я использую:Oracle - проблема с производительностью. Запрос с использованием GroupBy

SELECT p.name, p.id 
FROM v_emp e 
INNER JOIN v_prof p ON e.code = p.code 
WHERE e.emp_id IN (SELECT a.id 
        FROM t_approval a 
        WHERE a.code1 <> 'R' 
        AND a.code2 = 'P' 
        AND a.date1 IS NULL 
        AND a.date2 IS NULL 
        AND a.code3 = 'ADMIN' 
        GROUP BY a.id 
            ) 
GROUP BY p.name, p.id 
ORDER BY p.name 

Запрос занимает более 4 минут, чтобы выполнить. таблица t_approval имеет более 15 миллионов записей, и мне нужно, чтобы идентификаторы из этой таблицы соответствовали критериям поиска.

В этой таблице уже есть индекс для id, code1, code2, code3.

Пожалуйста, дайте мне знать, как сделать это быстрее.

+2

«В этой таблице уже есть индекс для id, code1, code2, code3». Какая таблица? У вас их три. Кроме того, это четыре отдельных индекса или один комбинированный индекс? Пожалуйста, разместите структуры таблиц и индексы для всех таблиц в вашем запросе. А также разместите план запроса. –

ответ

5
  • Что такое план запроса?
  • Почему существуют две статьи GROUP BY? Ни один из них не представляется необходимым, но поскольку мы не знаем ваших данных или вашей модели данных, трудно понять, пытаются ли они скрыть проблему, когда некоторые условия соединения отсутствуют.
  • Сколько из 15 миллионов строк в t_approval возвращает подзапрос? Насколько избирательны каждый из предикатов?
  • Сколько строк находится в двух других таблицах? Сколько строк возвращает весь ваш запрос?
  • Какие индексы доступны? Я предполагаю, что индекс (ы), о котором вы говорите, находится на таблице t_approval. Однако неясно, говоришь ли вы об одном составном индексе или о четырех отдельных индексах с одним столбцом или что-то еще. Неясно, какие индексы существуют в двух других таблицах.

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

SELECT p.name, p.id 
    FROM v_prof p 
WHERE EXISTS(SELECT 1 
       FROM v_emp e 
         JOIN t_approval a ON (e.emp_id = a.id) 
       WHERE e.code = p.code 
        AND a.code1 <> 'R' 
        AND a.code2 = 'P' 
        AND a.date1 IS NULL 
        AND a.date2 IS NULL 
        AND a.code3 = 'ADMIN') 
ORDER BY p.name 

Если это не работает, вам нужно чтобы помочь нам, разместив дополнительную информацию.

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