ストアドプロシージャを作成しました。これでパフォーマンスが非常に悪いことがわかりました。これはwhileループが原因だと思います。
ALTER PROCEDURE [dbo].[DeleteEmptyCatalogNodes]
@CatalogId UNIQUEIDENTIFIER,
@CatalogNodeType int = null
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CID UNIQUEIDENTIFIER
DECLARE @CNT int
SET @CID = @CatalogId
SET @CNT = @CatalogNodeType
DELETE cn FROM CatalogNodes cn
LEFT JOIN CatalogNodes as cnj on cn.CatalogNodeId = cnj.ParentId
LEFT JOIN CatalogArticles as ca on cn.CatalogNodeId = ca.CatalogNodeId
WHERE cn.CatalogId = @CID
AND cnj.CatalogNodeId IS NULL
AND ca.ArticleId IS NULL
AND (cn.CatalogNodeType = @CNT OR @CNT IS NULL)
WHILE (@@ROWCOUNT > 0)
BEGIN
DELETE cn FROM CatalogNodes cn
LEFT JOIN CatalogNodes as cnj on cn.CatalogNodeId = cnj.ParentId
LEFT JOIN CatalogArticles as ca on cn.CatalogNodeId = ca.CatalogNodeId
WHERE cn.CatalogId = @CID
AND cnj.CatalogNodeId IS NULL
AND ca.ArticleId IS NULL
AND (cn.CatalogNodeType = @CNT OR @CNT IS NULL)
END
END
もっと「設定」する方法についてヒントをくれる人はいますか?
どうもありがとう!
コメントと回答の編集:
テーブルは次のように作成されます。
カタログノード:
CatalogNodeId|ParentId|Name
1|NULL|Root
2|1|Node1
3|1|Node2
4|2|Node1.1
カタログ記事:
CatalogNodeId|Name
3|Article1
3|Article2
3|Article3
SP が呼び出された後、Node1 と Node1.1 を削除する必要があります。最初の delete ステートメントでは、Node1.1 が削除されます。While ループでは、Node1 が削除されます。私の問題が理解しやすくなったといいのですが、それはツリー構造です。