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
子句检查text1
或text2
等NOT 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
时分配一个值——而不是替换有效值。不过,这不是你的问题,所以我会继续。
对于一个简单的更新查询,您可以做两件事:
-
您可以确保每行只更新一次,并且不会尝试对没有更新的行进行更新。
如果要更新大部分行,则替换数据通常更有效(对于给定的行数,
insert
比 update
快)。
第一种方法建议使用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查询优化更新的主要内容,如果未能解决你的问题,请参考以下文章