具有派生表的SQL查询-性能问题

具有派生表的SQL查询-性能问题,sql,tsql,indexing,database-performance,derived-table,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 Ob

我有一个包含派生表的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分钟来完成,它收回了近30万行。整个查询(包含此项)所用的时间大致相同。如果没有派生表,只需不到一秒钟的时间,因此我知道是派生查询导致了问题

我的问题是,是否有任何方法可以提高去驱动表查询的速度?也许在StatusHistory表中添加一些索引(我在索引方面有点垃圾…)?或者使用派生表以外的其他方法

如有任何建议,我们将不胜感激


谢谢

查看我的评论-如果
StatusID
字段上还没有索引,您也可以在该字段上引入索引。尝试在WHERE子句中按可返回的记录数的顺序放置限制性更强的列。

正如JonH所指出的,展开索引,并根据WHERE标准将关键元素视为预期结果的最小粒度。。。如果“ObjectType”是一个字符串而不是文本,那么它可能会得到更好的优化。至于粒度。将返回最少数量的记录。。。状态ID是501和504的组合(通过OR条件)与“SchemeTypeApplication”的对象类型。如果501有50000条记录,504有30000条记录,但“SchemeTypeApplication”有475000条记录,我会首先在状态ID上建立索引,否则,反之亦然。。。让索引遍历80000条记录,在其中,475000个对象类型中有多少是501和504,可能是50000,这样就完成了。是的,您最初的注释是指返回大约300k行,但这只是根据查询的常用方式确定优化索引技术的一个示例。因此,我将索引如下


(statusID、ObjectType、IsDeleted、ObjectID)

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

我的猜测是,对于这个查询,它将有一个建议


这里有一些截图:

您的帖子中没有派生查询,只有一些布尔代数。您还应该首先在where子句中放置限制最严格的列。例如,如果您知道只有3条记录的状态为deleted,100万条记录的对象类型为schemetypeapplication,那么您应该将deleted状态作为where的开头。优化器可能会注意到这一点,尤其是在sql server的情况下,但这绝对值得注意。我想现在是学习索引的时候了,如果你要编写数据库查询,就没有理由成为“索引垃圾”。@JonH,我没有发布整个查询,因为它太大了。帖子中的查询是没有外部查询的派生查询-如果这有意义的话。@Jamie,最近接受了答案,我只是好奇您修改后的表/索引/查询现在的性能改进。