0

我有一个包含派生表的 SQL 查询。

派生查询如下所示:

SELECT 
   ObjectId, MIN(StatusHistoryId) AS FirstStatusHistoryId
FROM 
   dbo.StatusHistory
WHERE 
   ObjectType = 'SchemeTypeApplication' 
   AND (StatusId = 504 OR StatusId = 501) 
   AND IsDeleted = 0    
GROUP BY 
   ObjectId

这需要大约 2 分钟才能完成,它会拉回近 300k 行。整个查询(内部有这个)大致相同。如果没有派生表,它只需要不到一秒钟的时间,所以我知道是派生查询导致了问题。

我的问题是,有没有办法提高派生表查询的速度?也许向 StatusHistory 表添加一些索引(我对索引有点垃圾......)?还是使用派生表以外的其他方法?

任何建议表示赞赏。

谢谢

4

3 回答 3

1

正如 JonH 所指出的,扩展索引并根据您的 WHERE 标准将关键元素视为预期结果的最小粒度...如果您的“ObjectType”是一个字符串,则它可能会更好地优化它是一个可枚举的整数值也比文​​本基础。至于粒度。这将返回最少数量的记录...状态 ID 是 501 和 504 组合(通过您的 OR 条件)与“SchemeTypeApplication”的对象类型。如果 501 有 50,000 条记录,504 有 30,000 条记录,但“SchemeTypeApplication”有 475,000 条记录,我会先在状态 ID 上建立索引,否则,反之亦然......让索引吹过 80,000 条记录,在此范围内,如何475,000 个对象类型中有许多是 501 和 504,也许是 50,000,然后你就完成了。是的,您的原始评论是指返回大约 300k 行,但这只是根据您的查询通常如何使用来确定优化索引技术的一个示例。所以,我会索引类似的东西

(statusID、ObjectType、IsDeleted、ObjectID)

于 2012-02-01T16:17:42.067 回答
1

请参阅我上面的评论 - 如果该字段上还没有索引,您也可以在该字段上引入一个索引StatusID。尝试按照可以返回多少记录的顺序将限制性更强的列放在 WHERE 子句中。

于 2012-02-01T15:58:59.837 回答
0

如果您使用的是 Management Studio 2008(带有 2008 或 2005 数据库),您可以查看您的执行计划,看看它是否建议应该创建任何缺失的索引。

我的猜测是它将对此查询提出建议。

这里有一些截图: http ://weblogs.sqlteam.com/mladenp/archive/2008/12/29/SQL-Server-Management-Studio-2008-suggests-missing-indexes-with-actual.aspx

于 2012-02-01T17:54:48.573 回答