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