ICTIS-THL Ответов: 1

Оптимизация Sql-запросов, необходимая для MS access 2010


У меня есть таблица MyTable, в которой элементы хранятся со своим индивидуальным ссылочным кодом, ReferenceCode, но существуют различные версии каждого ссылочного кода, поскольку элементы были обновлены с течением времени, так что мы можем вернуться к историческим записям для каждого ссылочного кода.

Я написал некоторый SQL, который извлекает записи с самым высоким номером версии, чтобы извлечь самую новую версию каждого ссылочного кода и дать мне "живую" таблицу. Однако, кажется, что извлечение данных в таблицу занимает целую вечность (5,5 минут!) - и это в самом доступе!

В таблице содержится около 16 000 записей, и чуть более половины из них являются текущими живыми версиями. В таблице около 20 полей, и да, мне действительно нужно выбрать *.

Есть ли более быстрый способ сделать это в одном SQL-операторе?

Что я уже пробовал:

select * from [mytable] where ((([mytable].version)=(select max(x.version) from [mytable] as x where x.referencecode = [mytable].referencecode))) order by referencecode;

CHill60

Это работает лучше?

select A.* from [myTable] A
INNER JOIN (select referencecode, max([version]) as [version] from [myTable] group by referencecode) B
	ON B.referencecode = A.referencecode AND A.[version]=B.[version]
order by A.referencecode

ICTIS-THL

Если вы хотите представить отредактированный код в качестве решения, я с радостью его приму. :-)

ICTIS-THL

Нет... "Круговая референция, вызванная псевдонимом "версия" в списке выбора определения запроса"

ICTIS-THL

Но я отредактировал его, чтобы:
выберите A.* из [myTable] A
Внутреннее соединение (select referencecode, max(myTable.[версия]) как [версия] из группы [myTable] по ссылочному коду) B
На B. referencecode = A. referencecode и A.[version]=B.[version]
заказ по A. referencecode

И это кажется невероятно быстрым...

CHill60

Да-извините, что пропустил этот псевдоним таблицы: facepalm: я тестировал его в SQL, а не в Access, и первый менее привередлив в таких вещах.
Соединения всегда выполняются быстрее, чем прямые линейные подзапросы.
Рад был помочь.

1 Ответов

Рейтинг:
11

CHill60

OP подтвердил, что следующий запрос намного быстрее (после того, как они исправили мою ошибку :0)

select A.* from [myTable] A
INNER JOIN (select referencecode, max(myTable.[version]) as [version] from [myTable] group by referencecode) B
	ON B.referencecode = A.referencecode AND A.[version]=B.[version]
order by A.referencecode

Я сказал в своем комментарии, что " соединения всегда быстрее, чем ... подзапросы" - это не совсем верно. Это верно в данном случае, потому что исходный запрос использовал коррелированный подзапрос-то есть он ссылался на внешний запрос ...
select * from [mytable] where ((([mytable].version)=(select max(x.version) from [mytable] as x where x.referencecode = [mytable].referencecode))) order by referencecode;

Видеть Коррелированный подзапрос - Википедия[^]


Maciej Los

5ед!