2013-02-14 91 views
1

我從表中,如果選擇記錄其插入匹配不同table.It其中一個SQL程序如下提高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 

可有人請建議提示,以提高這種性能過程

+0

分析執行計劃。 – leppie 2013-02-14 07:33:22

回答

1

沒有看到底層表的結構,這是不可能的。嘗試使用CTRL + L查看估計的執行計劃。您可能想要將CREATE PROCEDURE內容註釋掉,這會使計劃更易於閱讀。

通常,這將是創建一個或兩個索引的情況。

您可能會發現將WHERE子句中的C.CountryCode = @countryCode移入INNER 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