Руководство по индексам для SQL-запросов - PullRequest
0 голосов
/ 14 апреля 2011

У кого-нибудь есть рекомендации о том, как подойти к созданию индексов для следующего запроса? Запрос работает, как и ожидалось, но я не могу обойтись при полном просмотре таблицы. Работа с Oracle 11g.

SELECT   v.volume_id
  FROM   (  SELECT   MIN (usv.volume_id) volume_id
              FROM   user_stage_volume usv
             WHERE   usv.status = 'NEW'
                     AND NOT EXISTS
                           (SELECT   1
                              FROM   user_stage_volume kusv
                             WHERE   kusv.deal_num = usv.deal_num
                                     AND kusv.locked = 'Y')
          GROUP BY   usv.deal_num, usv.volume_type
          ORDER BY   MAX (usv.priority) DESC, MIN (usv.last_update) ASC) v
 WHERE   ROWNUM = 1;

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

Вот скрипт создания таблицы. ПК является VOLUME_ID. DEAL_NUM не является уникальным.

CREATE TABLE ENDUR.USER_STAGE_VOLUME
(
  DEAL_NUM       NUMBER(38)                     NOT NULL,
  EXTERNAL_ID    NUMBER(38)                     NOT NULL,
  VOLUME_TYPE    NUMBER(38)                     NOT NULL,
  EXTERNAL_TYPE  VARCHAR2(100 BYTE)             NOT NULL,
  GMT_START      DATE                           NOT NULL,
  GMT_END        DATE                           NOT NULL,
  VALUE          FLOAT(126)                     NOT NULL,
  VOLUME_ID      NUMBER(38)                     NOT NULL,
  PRIORITY       INTEGER                        NOT NULL,
  STATUS         VARCHAR2(100 BYTE)             NOT NULL,
  LAST_UPDATE    DATE                           NOT NULL,
  LOCKED         CHAR(1 BYTE)                   NOT NULL,
  RETRY_COUNT    INTEGER                        DEFAULT 0 NOT NULL,
  INS_DATE       DATE                           NOT NULL
)

ALTER TABLE ENDUR.USER_STAGE_VOLUME ADD (
  PRIMARY KEY
 (VOLUME_ID))

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Индекс на (deal_num) очень поможет подзапросу.Фактически, индекс на (deal_num, locked) позволил бы подзапросу вообще избегать самой таблицы.

Следует ожидать полного сканирования таблицы по основному запросу, поскольку он фильтрует состояние, которое не проиндексировано (и, скорее всего, не получит выгоды от индексации, если только «NEW» не является достаточно редким значением для статуса).

0 голосов
/ 14 апреля 2011

Я думаю, что он выполняет ваш внутренний подзапрос (изнутри не существует ...) один раз для каждого запуска внешнего подзапроса.

Именно в этом случае производительность поражает - она ​​будет проходить через все user_stage_volume длякаждая строка в user_stage_volume, которая представляет собой O (n ^ 2), где n равно количеству строк в usv.

Альтернативой может быть создание представления для внутреннего подзапроса и использование этого представления или, альтернативно,назвать временное представление с помощью WITH.

...