0

以下の 2 つのクエリで、あるクエリのパフォーマンスが他のクエリよりも優れているかどうかを理解しようとしています。これを理解するためにあなたの助けに感謝します。

  1. このクエリは、1 日に数千回から数十万回呼び出され、挿入操作または更新操作である可能性があります。

-- CLUSTERED INDEX ON TYPE,ID ON XYZ テーブルがあります

クエリ 1:

DECLARE @paramDef NVARCHAR(1000)
DECLARE @columnName NVARCHAR(100)

SET @paramDef = '@Type nvarchar(100), @Id INT'
SET @columnValue = 'testField'

SET @strSql = 
    N'IF NOT EXISTS(SELECT 1 FROM XYZ WITH (NOLOCK) WHERE Type = @Type AND ID = @Id)
    BEGIN
        .... insert into XYZ code
    END
    ELSE IF EXISTS (SELECT 1 FROM XYZ WITH (NOLOCK) WHERE Type = @ReferenceType AND Id = @Id  
                AND ' + @columnname + ' IS NULL)
    BEGIN 
        .... update to XYZ code
    END'

sp_executesql @strSql, @paramDef, @Type = 'abc', @Id = '123' 

またはクエリ 2

DECLARE @paramDef NVARCHAR(100)
DECLARE @columnName NVARCHAR(100)

SET @paramDef = 'DECLARE @rowExists nvarchar(100), @columnValue nvarchar(100), @Type nvarchar(100), @Id INT'
SET @columnValue = 'testField'

SET @strSql = 
    N'SELECT @rowExists = 1, @columnValue=' + @columnname + ' FROM XYZ WITH (NOLOCK) WHERE Type = @Type AND ID = @Id
    IF (@rowExists IS NULL) --row does not exists then insert 
    BEGIN
        .... insert into XYZ code
    END
    ELSE IF (@rowExists = 1 and @columnValue IS NULL)
    BEGIN 
        .... update to XYZ code
    END'

sp_executesql @strSql, @paramDef, @Type = 'abc', @Id = '123', @rowExists = NULL, @columnValue = NULL

ありがとう。

4

2 に答える 2

0

クエリ 2 については、merge を使用して高速化してください。MERGE table AS TARGET USING (いくつかの値) AS SOURCE ON (TARGET.ID = SOURCE.ID and target.type=source.type) WHEN MATCHED AND TARGET.columnvalue<> SOURCE.columnvalue THEN UPDATE SET TARGET.columnvalue= SOURCE.columnvalue WHEN NOT MATCHED BY TARGET THEN INSERT (ID, type, columnvalue) VALUES (SOURCE.ID, SOURCE.type, SOURCE.columnvalue)

于 2013-06-07T10:04:18.140 に答える