У меня есть сценарий загрузки данных, где я создаю динамический SQL-запрос для извлечения данных и кеша в нашем сервисе. Существует 1 таблица, которая содержит все данные о продукте: ProductHistory (47 столбцов, 200 000 записей + и будет продолжать расти)
Что мне нужно:
Получить последние продукты, используя максимальный идентификатор, максимальную версию и максимальное изменение.
Первая попытка:
SELECT distinct Product.* FROM ProductHistory product
WHERE product.version =
(SELECT max(version) from ProductHistory p2 where product.Id = p2.Id
and product.changeId =
(SELECT max(changeid) from ProductHistory p3 where p2.changeId = p3.changeId))
Это заняло более 2,51 минуты.
Другая неудачная попытка:
select distinct product.* from ProductHistory product
where CAST(CAST(id as nvarchar)+'0'+CAST(Version as nvarchar)+'0'+CAST(changeid as nvarchar) as decimal) =
(select MAX(CAST(CAST(id as nvarchar)+'0'+CAST(Version as nvarchar)+'0'+CAST(changeid as nvarchar) as decimal)) from ProductHistory p2
where product.Id = p2.Id)
В основном он использует тот же принцип, что и при заказе дат, объединяя числа, упорядоченные по релевантности.
For example 11 Jun 2007 = 20070711
And in our case: Id = 4 , version = 127, changeid = 32 => 40127032
The zeros are there not to mix up the 3 different ids
Но это занимает 3,10 минуты !!! (
Итак, мне, в принципе, нужен способ улучшить мой запрос с первой попытки при любом удобном случае. Мне также было интересно с таким количеством данных, это лучшая скорость поиска, которую я должен ожидать?
Я запустил sp_helpindex ProductHistory и обнаружил индексы, как показано ниже:
PK_ProductHistoryNew - кластерный, уникальный первичный ключ, расположенный в PRIMARY-Id, версия
Я завернул первый запрос в SP, но все еще без изменений.
Итак, интересно, каким другим способом мы можем улучшить производительность этой операции?
Спасибо,
Mani
p.s: я просто запускаю эти запросы в SQL Management Stuido, чтобы увидеть время.