我已经为此苦苦挣扎了一段时间,在某些情况下,下面的 sql 需要超过 30 分钟才能在包含 100k 行current
且大约 10行的表上执行pending
。这是我已确定为罪魁祸首的更大连接语句的一部分。基本上,sql 的目的是对行的连接和current
行的副本进行排序,pending
以便所有待处理的行都位于顶部或底部。它是变革管理框架的一部分。有什么想法可以以始终如一的良好表现的方式完成吗?作为记录,在某些情况下,相同的 sql 在具有 10M 行和 100 条待处理更改的表上运行时间不到 10 秒。排序是在计算字段上完成的这一事实使问题更加复杂。数据库是 ms sql server 2008 R2。
更新:我正在添加其余的连接以表明这种疯狂是有原因的。
同样,这样做的唯一目的是获取当前记录和待处理记录的组合,以显示更改被批准后未来表的外观,排序以便更改显示在顶部或底部(hasPending 上的 ASC 或 DSC ),额外的 Current2 连接是添加一些额外的识别数据。
通常它会做它应该做的事情,相当不错的几秒钟的响应时间,当达到大约 1000 万条记录时为 10 秒,但是在少数情况下,一切都一直缓慢到爬行,响应时间高达 12-30 分钟。
WITH [ResultPage] AS
SELECT
ROW_NUMBER() OVER
(ORDER BY
CASE WHEN [Current].[ID] IN
(SELECT [CID]
FROM [Pending] AS p
INNER JOIN [Current] ON [Current].[ID] like p.[CID]
WHERE (p.[User] = 'admin'))
THEN 1
ELSE 0
END ASC,
[Current].[ID] ASC) AS [RowID],
[Current].[ID],
CASE WHEN [Current].[ID] IN
(SELECT [CID]
FROM [Pending] AS p
INNER JOIN [Current] ON [Current].[ID] like p.[CID]
WHERE (p.[User] = 'admin'))
THEN 1
ELSE 0
END AS [HasPending]
FROM [Current]
INNER JOIN [Current2] AS [Table2] ON ([Current].[T2ID] = [Table2].[ID])
SELECT [ResultPage].[RowID], [ResultPage].[HasPending], [Current2].[ID] As [Current2^ID], [Tag].Name],
etc... etc...
FROM [ResultPage]
INNER JOIN [Current] ON ([Current].[ID] = [ResultPage].[ID])
INNER JOIN [Current2] ON ([Current].[T2ID] = [Current2].[ID])
WHERE (([ResultPage].[RowID] BETWEEN -1 AND 50)) ORDER BY [ResultPage].[RowID] ASC