2016-05-10 2 views
-2

Я хочу оптимизировать этот запрос, но только с использованием индекса, подсказок, кластеров и pctfree и pctused. Благодарю.Мне нужна небольшая помощь для оптимизации

WITH 
    A AS (SELECT SSN from contracts where (end_date is null or end_date>sysdate)), 
    B AS (SELECT SSN,start_date, NVL(end_date,sysdate) finish, 
     (NVL(end_date,sysdate)-start_date) length 
    FROM CONTRACTS NATURAL JOIN A) 
    SELECT SSN 
     FROM B 
     GROUP BY SSN HAVING (Max(finish)-MIN(start_date)) > SUM(length) 
+3

Совершенно невозможно оптимизировать запрос, не зная полной структуры таблицы (с по крайней мере столбцами и индексами) и плана объяснения фактического заявления, пожалуйста, отправьте сообщение. Можете ли вы создавать новые индексы или использовать только существующие? Почему кластеры, pctfree и pctused? Уже существуют ваши таблицы, или вам нужно создавать новые таблицы, чтобы они могли легко получить доступ к вашему запросу? Будьте осторожны с NATURAL JOIN, это может быть очень опасно. – Aleksej

+0

Зачем вам вообще нужно участие? Вы можете просто положить предложение where из вашего подзапроса A в ваш подзапрос B. – Boneist

ответ

0

Вы должны быть в состоянии избавиться от объединения с помощью аналитического запроса:

SELECT SSN 
FROM (
    SELECT SSN, 
     start_date, 
     NVL(end_date, SYSDATE) finish, 
     COUNT(CASE WHEN end_date IS NULL OR end_date > SYSDATE THEN 1 END) 
      OVER (PARTITION BY SSN) AS has_invalid_end_date, 
    FROM contracts 
) 
WHERE has_invalid_end_date > 0 
GROUP BY SSN 
HAVING MAX(finish) - MIN(start_date) > SUM(finish - start_date); 
0

Я думаю, вы могли бы просто переписать это как:

with b as (select ssn, 
        start_date, 
        nvl(end_date, sysdate) finish_date, 
        nvl(end_date, sysdate) - start_date duration 
      from contracts) 
select ssn 
from  b 
where end_date is null 
or  end_date > sysdate 
group by ssn 
having max(finish_date) - min(start_date) > sum(duration); 

Вы могли бы также выгоду от индекса на (ssn, start_date, end_date).

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