优化 SQL 查询以避免重复

Posted

技术标签:

【中文标题】优化 SQL 查询以避免重复【英文标题】:Optimize a SQL query to avoid repeating 【发布时间】:2016-05-01 22:22:29 【问题描述】:

我有一个很长的 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。 Table1 只有 3 列 (Id, Parameter, Value)

有人知道如何优化这个查询吗?

【问题讨论】:

如何从 Table1 中选择 Id_Unique?它不在那里.. 另外,您在 Parametrr 上有一个索引,对吗? @Strawberry 我相信基于SQL Server的标签 不幸的是,在 SQL 中的某些地方,性能优化的代码必须重复。在这种情况下,您最好的选择是 MERGE 语句,它可能看起来很重复。 top 1 in if exists 是多余的,可能会降低性能。使用IF EXISTS (SELECT 1 FROM Table1 WHERE Parameter= @Parameter1) 您没有向我们展示您的查询 【参考方案1】:

如果您的 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;

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

【讨论】:

以上是关于优化 SQL 查询以避免重复的主要内容,如果未能解决你的问题,请参考以下文章

Sql查询优化

如何避免 BigQuery 中的 Power BI 增量刷新重复查询?

Mysql group_concat 的重复键和 1 个查询中多列的重复计数(查询优化)

SQL 优化器/执行计划 - 重复子查询

SQL UDF 和查询优化 [重复]

优化 SQL 查询以避免全表扫描