我有一个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表中添加一些索引(我对索引有点垃圾......)?或者除了使用派生表之外的其他一些方法?
任何建议都表示赞赏。
由于
答案 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数据库),您可以查看执行计划,看看它是否建议应该创建任何缺失的索引。
我的猜测是它会推荐此查询。