【问题标题】:SQL query optimize for updateSQL查询优化更新
【发布时间】: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 。 . .我认为您查询中的逻辑是倒退的。为什么要用单个值替换 现有 数据?

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


【解决方案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 时分配一个值——而不是替换有效值。不过,这不是你的问题,所以我会继续。

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

      1. 您可以确保每行只更新一次,并且不会尝试对没有更新的行进行更新。
      2. 如果要更新大部分行,则替换数据通常更有效(对于给定的行数,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;
      

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 2021-07-10
        • 2015-11-08
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多