SQL查询优化更新

Posted

技术标签:

【中文标题】SQL查询优化更新【英文标题】:SQL query optimize for update 【发布时间】:2019-10-31 08:15:26 【问题描述】:

这个查询需要很长时间才能更新我很想优化这个查询, 您的帮助将不胜感激。

DECLARE @text1 NVARCHAR(50) = N'test1'
DECLARE @text2 NVARCHAR(50) = N'test2'
DECLARE @text3 NVARCHAR(50) = N'test3'
DECLARE @text4 NVARCHAR(50) = N'test4'
DECLARE @text5 NVARCHAR(50) = N'test5'

UPDATE dbo.Session SET
text1 = CASE
WHEN text1 IS NOT NULL THEN @text1
ELSE text1 END  ,
text2 = CASE
WHEN text2 IS NOT NULL THEN @text2
ELSE text2 END,
text3 = CASE
WHEN text3 IS NOT NULL THEN @text3
ELSE text3 END,
text4 = CASE
WHEN text4 IS NOT NULL THEN @text4
ELSE text4 END,
text5 = CASE
WHEN text5 IS NOT NULL THEN @text5
ELSE text5 END

【问题讨论】:

您的代码实际上看起来已经很优化了。你有什么性能问题吗? 添加一个WHERE 子句检查text1text2NOT NULL @Ahmed 。 . .我认为您查询中的逻辑是倒退的。为什么要用单个值替换 现有 数据? 【参考方案1】:

你可以试试这个:

DECLARE @text1 NVARCHAR(50) = N'test1', 
@text2 NVARCHAR(50) = N'test2',
@text3 NVARCHAR(50) = N'test3',
@text4 NVARCHAR(50) = N'test4',
@text5 NVARCHAR(50) = N'test5'


UPDATE dbo.Session
SET text1 = ISNULL(text1,@text1)  ,
text2 = ISNULL(text2,@text2),
text3 = ISNULL(text3,@text3),
text4 = ISNULL(text4,@text4),
text5 = ISNULL(text5,@text5)

【讨论】:

【参考方案2】:

创建新表通常比更新现有表更优化(在时间上)。

create table dbo.Session_1 nologging as 
select /*Insert the other columns from the old table that you want to keep here*/
    decode(text1, null, null, 'test1') as text1,
    decode(text2, null, null, 'test1') as text2,
    decode(text3, null, null, 'test1') as text3,
    decode(text4, null, null, 'test1') as text4,
    decode(text5, null, null, 'test1') as text5
from dbo.Session;

然后你可以删除旧表并重命名新表:

drop table dbo.Session;
alter table dbo.Session_1
rename to dbo.Session;

【讨论】:

【参考方案3】:

首先,我认为你的逻辑是倒退的。通常,意图是在现有值为NULL 时分配一个值——而不是替换有效值。不过,这不是你的问题,所以我会继续。

对于一个简单的更新查询,您可以做两件事:

    您可以确保每行只更新一次,并且不会尝试对没有更新的行进行更新。 如果要更新大部分行,则替换数据通常更有效(对于给定的行数,insertupdate 快)。

第一种方法建议使用WHERE 子句:

UPDATE dbo.Session    
    SET text1 = (CASE WHEN text1 IS NOT NULL THEN @text1
    END),
        text2 = (CASE WHEN text2 IS NOT NULL THEN @text2
    END),
        text3 = (CASE WHEN text3 IS NOT NULL THEN @text3
    END),
        text4 = (CASE WHEN text4 IS NOT NULL THEN @text4
    END),
        text5 = (CASE WHEN text5 IS NOT NULL THEN @text5 END)
    WHERE text1 IS NOT NULL OR
          text2 IS NOT NULL OR
          text3 IS NOT NULL OR
          text4 IS NOT NULL OR
          text5 IS NOT NULL;

【讨论】:

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

以下 7 个更新查询的 SQL 优化。同一张桌子。合二为一?

mysql 简单的sql优化示例[不定时更新]

SQL 查询优化

SQL 查询优化。估计与实际行数

优化 SQL Server 2008 查询

[转]mysql大表更新sql的优化策略