У меня есть сценарий загрузки данных, в котором я создаю динамический запрос 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, но все еще без изменений.
Итак, хотите знать, какими еще способами мы можем улучшить производительность этой операции?
Спасибо, Мани p.s: Я просто запускаю эти запросы в SQL Management stuido, чтобы узнать время.