【发布时间】:2011-11-08 11:02:04
【问题描述】:
我有大约 30 个字符串传递给我的存储过程,它们充当我需要操作的表的列。每个字符串都是分隔的,我使用 split 函数将这些字符串中的每一个拆分成适当的行,这些行通常包含 20 行或更少的行。 split 函数非常快,并返回一个表结果,其中一列是主键 ID,另一列是拆分值,从检查执行计划来看,三十个拆分只占用了我一小部分时间。似乎影响我表现的部分是这 30 个拆分结果集的实际连接。
DECLARE @WorkingTab TABLE ([ID] INT PRIMARY KEY, [Col1] VARCHAR(255), [Col2] VARCHAR(255), ...)
INSERT INTO @WorkingTab ([ID], [Col1], [Col2], ...)
SELECT
splitStr1.ID,
splitStr1.VALUE,
splitStr2.VALUE,
.
.
.
FROM
dbo.Split(@Str1, '~') splitStr1
LEFT JOIN
dbo.Split(@Str2, '~') splitStr2
ON splitStr1.ID = splitStr2.ID
LEFT JOIN
dbo.Split(@Str3, '~') splitStr3
.
.
.
我尝试使用内连接而不是左连接,这会稍微降低性能。我尝试仅将第一个拆分结果插入索引临时表,然后将其余列值更新到临时表中的适当列中,这再次导致性能略有下降。我尝试将所有结果插入到一个持久表中,但这根本没有提高性能。如果有人对解决此问题的其他方法或只是一般性能提示有任何建议,我会全神贯注。提前致谢。
【问题讨论】:
-
这看起来是一种可怕的方式来完成你想要的!您能退后一步,告诉我们您要解决的实际问题吗...
-
其中一个许多问题是不能使用索引。这是一个非常糟糕的方法,应该重新设计。
-
你至少应该说出你想用这段代码实现的什么。 @Str1 是什么?代码不清楚。
-
核心问题是我基本上需要从经典的 ASP Web 应用程序将数据表放入存储过程中。我离成为数据库专家还差得很远,所以首先想到的是获取所有分隔字符串,将它们传递给 SP,将它们拆分,然后将它们重新组合到一个表中以供使用。我将是第一个承认这看起来比所有人都丑陋的人,如果有更好的方法来处理这个问题,我很乐意接受建议。至于@Str1是什么,只是传给SP的字符串变量。
标签: sql performance tsql join