我有一个数据加载场景,我创建动态 sql 查询以在我们的服务中提取数据和缓存。有 1 个表包含所有产品数据:ProductHistory(47 列,200,000 条记录 + 并将继续增长)
我需要: 通过使用最大id、最大版本和最大changeid获取最新产品。
第一次尝试:
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 ps:我只是在 SQL management stuido 中运行这些查询来查看时间。