优化SQL查询以避免重复

时间:2016-05-01 22:22:29

标签: sql sql-server performance optimization query-optimization

我有一个很长的SQL查询,将使用4个不同的参数执行,因此我必须重复此查询4次。我试图对其进行优化,但它无法正常工作。这是我的疑问:

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)

有谁知道如何优化此查询?

1 个答案:

答案 0 :(得分: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;

或者,您可以使用任何其他方式填充最适合您情况的表变量 - 这取决于您。