我有一个数据加载场景,我创建动态 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 中,但仍然没有任何变化。
那么,想知道我们可以通过哪些其他方式来提高此操作的性能?
谢谢, 玛尼 p.s:我只是在 SQL Management Stuido 中运行这些查询来查看时间。
最佳答案
从 Sql Server Management Studio 运行查询并查看查询计划以了解瓶颈所在。在任何地方,您看到“表扫描”或“索引扫描”时,它都必须遍历所有数据才能找到它要查找的内容。如果您创建可用于这些操作的适当索引,它应该会提高性能。
关于SQL 查询 - 需要提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760075/