Я пытаюсь оптимизировать запрос.
Мой вопрос похож на MySQL, Union ALL и LIMIT, и ответ может быть то же самое (боюсь). Однако в моем случае есть более строгое ограничение (1), а также индекс в столбце даты и времени.
Итак, приступим:
Для простоты возьмем только одну таблицу с тремя: столбцами:
- md5 (варчар)
- значение (varchar).
- последнее обновление (дата-время)
Есть индекс (md5, обновлено), поэтому выбор ключа md5, упорядочение по обновлению и ограничение до 1 будут оптимизированы.
Поиск должен вернуть максимум одну запись, соответствующую одному из 10 ключей md5. Ключи имеют приоритет. Таким образом, если есть запись с приоритетом 1, она будет предпочтительнее любой записи с приоритетом 2, 3 и т. д.
В настоящее время UNION ALL используется:
select * from
(
(
select 0 prio, value
from mytable
where md5 = '7b76e7c87e1e697d08300fd9058ed1db'
order by lastupdated desc
limit 1
)
union all
(
select 1 prio, value
from mytable
where md5 = 'eb36cd1c563ffedc6adaf8b74c259723'
order by lastupdated desc
limit 1
)
) x
order by prio
limit 1;
Это работает, но UNION, кажется, выполняет все 10 запросов, если предоставлено 10 ключей.
Однако с точки зрения бизнеса было бы нормально запускать выборки последовательно и останавливаться после первого совпадения.
Возможно ли это, хотя простой SQL?
Или единственным вариантом будет хранимая процедура?