Можно ли оптимизировать запрос Temporal Property для удаления подзапроса MAX? - PullRequest
1 голос
/ 15 мая 2019

У меня есть следующий DDL, который пытается реализовать шаблон Temporal Property

CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) NOT NULL,
  `effective_on` DATE NOT NULL,
  `name` varchar(200) NOT NULL,
  `value` varchar(200) NOT NULL,
  `superceded_by` int(6),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

create unique index zzz on `docs` (id);
alter table `docs` add FOREIGN KEY (superceded_by) REFERENCES docs(id) ON DELETE CASCADE;

CREATE UNIQUE INDEX xyz ON `docs` (name, effective_on, superceded_by);

и соответствующий запрос

select `value` from docs
where
superceded_by is null and name = 'p1' and
effective_on = (
select max(effective_on) from docs
where
superceded_by is null
and effective_on <= '2017-01-01'
and name = 'p1' )

http://sqlfiddle.com/#!9/a07c84/1

В текущем SQL-запросе используется подзапрос, который меня интересовал, можно ли его исключить или еще больше упростить запрос для повышения производительности.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Я бы написал запрос следующим образом:

select d.`value`
from docs d
where d.superceded_by is null and
      d.name = 'p1' and
      d.effective_on = (select max(d2.effective_on)
                        from docs d2
                        where d2.superceded_by is null and
                              d2.name = d.name and
                              d2.effective_on <= '2017-01-01'
                       );

Тогда вам нужен индекс для docs(name, superceded_by, effective_on).Порядок столбцов в индексе очень важен.Первый ключ используется для предложения корреляции;второй для фильтрации по superceded_by.Затем нужно отсканировать окончательный ключ, чтобы получить правильную дату.

0 голосов
/ 15 мая 2019

для производительности вы должны добавить составной индекс на

table docs  columns (effective_on, name, superceded_by ) 

Ваш уникальный индекс по идентификатору не подходит, у вас уже есть индекс первичного ключа по идентификатору

а также ограничение для внешнего ключа на самой таблице не имеет смысла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...