我有一个数据加载场景,需要创建动态SQL查询来拉取数据并在我们的服务中进行缓存。有一个包含所有产品数据的表:ProductHistory(47列,200,000条记录+且将继续增长)
我需要什么: 通过使用最大ID、最大版本和最大更改ID获取最新的产品。
第一次尝试:
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,Version
我将第一个查询包装在SP中,但仍然没有变化。
那么,我们可以通过什么其他方式来提高此操作的性能呢?
谢谢, Mani p.s:我只是在SQL管理工具中运行这些查询以查看时间。