SQL 查询 - 需要提高性能

标签 sql sql-server database-performance

我有一个数据加载场景,我创建动态 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 分钟!!! :(

所以,我基本上需要一种方法来使我的第一次尝试查询更好。我还想知道这么多数据,这是我应该期望的最佳检索速度吗?

  1. 我运行了sp_helpindex ProductHistory并找到了如下索引:

    PK_ProductHistoryNew - 位于 PRIMARY-Id、版本上的集群、唯一主键

  2. 我将第一个查询包装在 SP 中,但仍然没有任何变化。

那么,想知道我们可以通过哪些其他方式来提高此操作的性能?

谢谢, 玛尼 p.s:我只是在 SQL Management Stuido 中运行这些查询来查看时间。

最佳答案

从 Sql Server Management Studio 运行查询并查看查询计划以了解瓶颈所在。在任何地方,您看到“表扫描”或“索引扫描”时,它都必须遍历所有数据才能找到它要查找的内容。如果您创建可用于这些操作的适当索引,它应该会提高性能。

关于SQL 查询 - 需要提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760075/

相关文章:

mysql - MySQL 中非常慢的查询

c++ - 将 Informix Object Interface for C++ 用于不带参数的存储过程/函数

sql-server - SQL Server 中的过滤索引缺少谓词无法按预期工作

sql-server - CTRL + K、CTRL + F(格式代码)在 MS SQL Server 中不起作用

python - 设置 SQLite 数据库进行聚类分析

sql - 为什么 Oracle 使用 ORDER BY 忽略索引?

sql - 删除除 TOP 1 之外的其他内容

SQL LIKE 问题

sql - 是否可以将变量传递给 SQL/DDL 脚本?

sql - 使用显式 create table 语句与 select into 创建表