2013-02-14 3 views
1

у меня есть процедура Sql, которая выбрать записи из таблицы и, если он соответствует вставке к другому table.It выглядит следующим образомповысить эффективность процедуры 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

ответ

1

Не видя структуры для лежащих внизу таблиц, невозможно помочь. Попробуйте использовать CTRL + L для просмотра оценочного плана выполнения. Вы можете прокомментировать материал CREATE PROCEDURE, это облегчит чтение плана.

Обычно это будет случай создания индекса или двух.

Вы можете обнаружить, что перемещение C.CountryCode = @countryCode из пункта WHERE в 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