1

テーブルからレコードを選択するSQLプロシージャがあり、一致する場合は別のテーブルに挿入します。次のとおりです

    CREATE PROCEDURE [dbo].[MarkCopyData] 
@copyDataOperationId int,
@countryCode nvarchar(50),
@batchCount int,@batchId int,@jobId int
    AS
    BEGIN
DECLARE @TableObjectId AS Int;
SET @TableObjectId = OBJECT_ID('Table1');
INSERT INTO  
    Table2(
            TableObjectId, 
            SourcePrimaryKey, 
            DestinationCopyOperationId, 
            IsModifiedAftertCopied,IsDeleted,BatchId,JobId)

    SELECT TOP (@batchCount) @TableObjectId, tbl1.pkid, @copyDataOperationId,      0,0,@batchId,@jobId
    FROM [dbo].[Table1] AS tbl1
    Inner join [dbo].[Country] AS C on C.CountryId =  tbl1.fkid
    LEFT OUTER JOIN Table2 tbl2 on (tbl2 .SourcePrimaryKey = tbl1.pkid and tbl2 .TableObjectId = @TableObjectId)
    WHERE C.CountryCode = @countryCode AND tbl2.DestinationCopyOperationId IS NULL
    SELECT @@ROWCOUNT
    END
    GO

誰でもこの手順のパフォーマンスを向上させるためのヒントを提案できますか

4

1 に答える 1

1

基礎となるテーブルの構造を見なければ、解決することはできません。CTRL+L を使用して、推定実行計画を表示してみてください。CREATE PROCEDURE計画を読みやすくするために、コメントアウトすることをお勧めします。

通常、1 つまたは 2 つのインデックスを作成する場合です。

the を節C.CountryCode = @countryCodeから theに移動すると、少しは役立つかもしれません。通常、外部結合を開始する前に、結果セットをフィルター処理する必要があります。WHEREINNER JOIN

SELECT TOP (@batchCount) @TableObjectId, tbl1.pkid, @copyDataOperationId,0,0,@batchId,@jobId
FROM [dbo].[Table1] AS tbl1
Inner join [dbo].[Country] AS C on C.CountryId =  tbl1.fkid AND C.CountryCode = @countryCode
LEFT OUTER JOIN Table2 tbl2 on (tbl2 .SourcePrimaryKey = tbl1.pkid and tbl2 .TableObjectId = @TableObjectId)
WHERE tbl2.DestinationCopyOperationId IS NULL
于 2013-02-14T07:42:53.693 に答える