2013-02-14 40 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