私はしばらくの間これに取り組んできました。場合によっては、以下のsqlは100k行のテーブルで実行するのに30分以上かかりcurrent
、約10はpending
です。これは、私が犯人であると特定した、より大きな結合ステートメントの一部です。基本的に、SQLの目的は、行の結合とcurrent
行のコピーを並べ替えて、pending
保留中のすべての行が上または下になるようにすることです。これは、変更フレームワークの管理の一部です。一貫してうまく機能するマナーでこれをどのように行うことができるかについてのアイデアはありますか?レコードの場合、同じSQLが、1,000万行と数百の保留中の変更があるテーブルで10秒未満で実行される場合があります。問題は、計算されたフィールドでソートが行われるという事実によって悪化します。データベースはmssqlserver2008R2です。
更新:狂気に半理由があることを示すために、残りの結合を追加しています。
繰り返しますが、これの唯一の目的は、現在のレコードと保留中のレコードの組み合わせを取得し、変更が承認され、変更が上部または下部に表示されるように並べ替えられた後の将来のテーブルがどのようになるかを示すことです(hasPendingのASCまたはDSC) )、追加のCurrent2結合は、いくつかの追加の識別データを追加することです。
一般に、それは本来の動作を実行します。応答時間は数秒で、約1,000万レコードに達すると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