Eve*_*ers 6 sql sql-server database-performance
我有一个数据加载场景,我在其中创建动态SQL查询以在我们的服务中提取数据和缓存.有1个表包含所有产品数据:ProductHistory(47列,200,000条记录+并将继续增长)
我需要的是: 使用最大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))
Run Code Online (Sandbox Code Playgroud)
这耗时超过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)
Run Code Online (Sandbox Code Playgroud)
它基本上使用与订购日期时相同的原则,连接按相关性排序的数字.
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
Run Code Online (Sandbox Code Playgroud)
但是这个需要3.10分钟!:(
所以,我基本上需要一种方法来让我的第一次尝试查询更好.我也想知道这么多数据,这是我应该期待的最佳检索速度吗?
我运行sp_helpindex ProductHistory并找到索引如下:
PK_ProductHistoryNew - 位于PRIMARY-Id,Version上的集群唯一主键
我在SP中包装了第一个查询,但仍然没有变化.
那么,想知道通过什么其他方式我们可以改善这种操作的性能?
谢谢,Mani ps:我只是在SQL管理stuido中运行这些查询来查看时间.
从Sql Server Management Studio运行查询并查看查询计划以查看瓶颈的位置.在任何你看到"表扫描"或"索引扫描"的地方,它必须通过所有数据来查找它正在寻找的内容.如果您创建可用于这些操作的适当索引,则应该提高性能.
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |