Оптимизация больше, чем оператор - PullRequest
1 голос
/ 10 января 2020
Таблица кредитов

и таблица validtransaction содержат миллион записей с 2008 года.

Мы делаем миграцию. Поэтому мне нужно выяснить значения типов кредитов, которые больше не используются после 2017 года (periodseq = 1055), чтобы их не нужно было переносить.

Это запрос, а часть> = приводит к огромным затратам. , Пожалуйста, предложите альтернативу.

SELECT CREDITTYPEID
FROM CREDITTYPE ct
WHERE NOT EXISTS
  (SELECT 1
  FROM CREDIT C
  WHERE C.PERIODSEQ>=1055
  AND C.CREDITTYPEID=CT.CREDITTYPEID
  ); 

enter image description here

Ответы [ 3 ]

1 голос
/ 10 января 2020

Я думаю, что агрегация:

SELECT C.CREDITTYPEID
FROM CREDIT C
GROUP BY C.CREDITTYPEID
HAVING MAX(C.PERIODSEQ) < 1055;

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

В противном случае, для вашей версии запроса вы специально хочу индекс на CREDIT(CREDITTYPEID, PERIODSEQ). Порядок ключей имеет значение, и это правильный порядок для вашего запроса.

1 голос
/ 10 января 2020

Это должно вернуть ваш (отличный!) Список CREDITTYPEID, которые использовались в прошлом, но не используются в настоящее время (после PERIODSEQ 1055)

SELECT CREDITTYPEID  /* used before 1055 */
FROM CREDITTYPE ct
WHERE PERIODSEQ < 1055
MINUS
SELECT CREDITTYPEID /* used after 1055 */
FROM CREDITTYPE ct
WHERE PERIODSEQ>=1055;

Как следует из названия столбца CREDITTYPEID является типом , поэтому в таблице есть несколько строк с одинаковым typeId.

Приведенный выше запрос возвращает только отдельный список и не использует ha sh anti присоединиться.

Вы можете добавить parallel option (с подсказкой PARALLEL ), если ваш HW позволяет это.

0 голосов
/ 10 января 2020

Должен помочь следующий индекс в таблице CREDIT:

CREATE INDEX idx ON CREDIT (PERIODSEQ, CREDITTYPEID);

Это должно позволить поиску предложения EXISTS оценить быстрее. Вы также можете попробовать следующий вариант индекса, который меняет порядок столбцов:

CREATE INDEX idx ON CREDIT (CREDITTYPEID, PERIODSEQ);
...