【发布时间】:2013-10-04 18:27:05
【问题描述】:
我有一个存储过程,它在 WHILE 循环中运行几个查询,尤其是这些查询比 SP 的其余部分花费的时间呈指数增长,大大降低了我的性能。
我在一些地方读到,如果您只从第一个表中提取列,则使用 IN 与 INNER JOIN 可以提高性能,这正是我正在做的。
然而,问题是我没有第一个线索来了解如何用IN 子句替换我的INNER JOIN。我知道IN 的语法与INNER JOIN 非常不同,但我不知道从哪里开始。
作为脚注,SQL 不是我的强项。非常感谢所有建议。
这是其中的一个查询。它们在逻辑上几乎相同。
SELECT @CurrentKey = riv.Key
FROM ResourceInfo_VW riv
INNER JOIN (SELECT Track,
Code,
[Language]
FROM ResourceInfo_VW
WHERE Key = @CurrentKey) AS riv2
ON riv.Track = riv2.Track
AND riv.Code = riv2.Code
AND riv.[Language] = riv2.[Language]
INNER JOIN UserGroupCourseCatalog_VW ugcc
ON riv.Key = ugcc.Key
WHERE riv.[Type] = 'a'
AND ugcc.UserGroupKey = @UserGroupKey
【问题讨论】:
-
如果您指定列,SQL Server 将知道您只是从第一个表中提取列。如果您正在使用 SELECT *,请停止这样做。 IN 不会神奇地改变连接的性能。
-
可能只是 WHILE 循环本身在减慢您的查询速度。
-
我喜欢@Richard 的想法。我会采用基于集合的方法来解决这个问题。
-
您是否介意在这里更深入地了解您想要实现的整体目标。它可能会帮助某人提供更完整的解决方案。
-
对派生表的联接有什么作用?另外,这里是否有对@Key 的循环引用?
标签: sql sql-server sql-server-2008 join