【发布时间】:2012-06-27 02:21:27
【问题描述】:
我有一个需要很长时间才能完成的 SQL 查询(对于 SQL Server 2008 R2)。我想知道是否有更好的方法?
SELECT @count = COUNT(Name)
FROM Table1 t
WHERE t.Name = @name AND t.Code NOT IN (SELECT Code FROM ExcludedCodes)
Table1 中有大约 9000 万行,并按名称和代码进行索引。 ExcludedCodes 中只有大约 30 行。
这个查询在一个存储过程中,被调用了大约 40k 次,完成该过程的总时间是 27 分钟。我相信这是我最大的瓶颈,因为它查询的行数量很大,而且它执行的次数。
因此,如果您知道优化它的好方法,将不胜感激!如果它不能被优化,那么我想我会坚持 27 分钟......
编辑
我将 NOT IN 更改为 NOT EXISTS 并将时间缩短到 10:59,因此仅此一项对我来说是一个巨大的收获。我仍然会尝试按照下面的建议执行 group by 语句,但这需要完全重写存储过程并且可能需要一些时间......(正如我之前所说,我不是最擅长 SQL,但它正在开始在我身上成长。^^)
【问题讨论】:
-
伙计,你正在解析 90M-30 行 40000 次......你到底期望什么:D
-
你考虑过使用 JOIN 吗?
-
lol 我没想到它会很快,但我不是 SQL 库鲁,所以我不确定我是否遗漏了一些非常简单的东西。不,不幸的是,名称不是唯一的.. :(
-
不,我并没有真正考虑过在这种情况下使用连接,真的不确定它是否会更快/老实说是必要的。但就像我说的,我不是大师!大声笑
-
ExcludedCodes 上有索引吗?
标签: sql sql-server-2008 tsql optimization