SQL查询与派生表 - 性能问题

时间:2012-02-01 15:53:23

标签: sql tsql indexing database-performance derived-table

我有一个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行。整个查询(使用此内部)大致相同。如果没有派生表,则只需不到一秒钟,因此我知道这是导致问题的原始查询。

我的问题是,无论如何都要提高dereived表查询的速度?也许在StatusHistory表中添加一些索引(我对索引有点垃圾......)?或者除了使用派生表之外的其他一些方法?

任何建议都表示赞赏。

由于

3 个答案:

答案 0 :(得分:1)

请参阅上面的评论 - 如果上面没有一个索引,您还可以在StatusID字段上引入索引。尝试将更严格的列放在WHERE子句中,以便返回多少条记录。

答案 1 :(得分: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)

答案 2 :(得分: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