【发布时间】:2012-02-24 07:33:08
【问题描述】:
我有一个包含派生表的 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 表添加一些索引(我对索引有点垃圾......)?还是使用派生表以外的其他方法?
欢迎提出任何建议。
谢谢
【问题讨论】:
-
您的帖子中没有派生查询,只有一些布尔代数。您还应该首先将最严格的列放在 where 子句中。例如,如果您知道只有 3 条状态为已删除的记录和 100 万条具有对象类型 schemetypeapplication 的记录,那么您应该将已删除状态移动到您的 where 的开头。优化器可能会选择这个,特别是如果它是 sql server,但它绝对值得注意。
-
猜猜是时候学习索引了,如果您要编写数据库查询,就没有理由“索引垃圾”。
-
@JonH,我没有发布整个查询,因为它太大了。帖子中的查询是没有外部查询的派生查询 - 如果有意义的话。
标签: sql tsql indexing database-performance derived-table