0

私は4つの異なるパラメータで実行される長いSQLクエリを持っているので、このクエリを4回繰り返す必要があります。私はそれを最適化しようとしているが、動作していない。ここに私のクエリは次のとおりです。繰り返しを避けるためにSQLクエリを最適化

IF EXISTS (SELECT TOP 1 Id_Unique FROM Table1 WHERE Parameter= @Parameter1) 
BEGIN 
    UPDATE Table1 
    SET Value = 'True' 
    WHERE Parameter = @Parameter1 
END 
ELSE 
BEGIN 
    INSERT INTO Table1 (Parameter, Value) 
    VALUES(@Parameter1, 'True') 
END 

反復ごとに変化する唯一のものは、パラメータ名です:@Parameter1/@Parameter2/@Parameter3/@Parameter4。 テーブル1には3列しかありません(Id, Parameter, Value)

誰でもこのクエリを最適化する方法を知っていますか?

+0

どのようにしてId_UniqueをTable1から選択できますか?そこにはありません。また、あなたはParametrrのインデックスを持っていますよね? –

+0

@Strawberry私は、 –

+1

タグに基づいてSQL Serverを信じています残念ながら、パフォーマンスに最適化された_must_コード自体が繰り返されるSQLの場所があります。この場合、最良のオプションはMERGEステートメントであり、繰り返されるようです。 –

答えて

0

SQL Serverインスタンスのバージョン(2008以降)がサポートされている場合は、パラメータとその値をテーブル変数に入れてから、単一のMERGEステートメントを実行できます。など

-- Incoming set of parameter values 
declare @x xml = N'<Parameters> 
    <Item Name="Parameter1" Value="Value1" /> 
    <Item Name="Parameter2" Value="Value2" /> 
    <Item Name="Parameter3" Value="Value3" /> 
    <Item Name="Parameter4" Value="Value4" /> 
</Parameters>'; 

declare @t table(
    Name varchar(100) primary key, 
    Value nvarchar(max) not null 
); 

insert into @t (Name, Value) 
select t.c.value('./@Name', 'varchar(100)') as [Name], 
    t.c.value('./@Value', 'nvarchar(max)') as [Value] 
from @x.nodes('/Parameters[1]/Item') t(c); 

merge dbo.Table1 t 
using (select * from @t) s 
on t.Parameter = s.Name 
when not matched by target then 
    insert (Parameter, Value) 
    values (s.Name, s.Value) 
when matched then 
    update set Value = s.Value; 

または、あなたはあなたの状況の中で最も適しているテーブル変数を移入するために他の方法を使用することができます - それはあなた次第です。

関連する問題