【优化SQL Server循环更新、插入耗时长的问题】
一: 工作当中遇到更新较多数据时,使用循环(while,或游标)进行增删改时,特别费时
WHILE @i <= @rows
BEGIN
SELECT @appNo = AppNumber, @roleid = RoleId, @statusi= Status, @empId = EmployeeId FROM #Atable WHERE ID = @i
IF EXISTS(SELECT 1 FROM Btable WHERE AppNumber = @appNo AND RoleID = @roleid AND EmployeeId = @empId)
BEGIN
UPDATE Btable
SET Status = @statusi, CreatedBy = NULL, ModifiedOn = GETDATE()
WHERE AppNumber = @appNoi AND RoleId = @roleidi AND EmployeeId = @empId
END
ELSE
BEGIN
INSERT INTO Btable(EmployeeId, AppNumber, RoleId, Status, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy)
SELECT EmployeeId, AppNumber, RoleId, Status, GETDATE(), CreatedBy, GETDATE(), ModifiedBy FROM #Atable WHERE ID = @i
END
SELECT @i= @i + 1
END
二:利用表左、右连接进行批量删除解决循环增删改耗时长的问题
update aru set aru.Status = arul.Status, aru.ModifiedOn = GETDATE()
from Btable as aru
inner join Atable as arul
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
三:A,B两张表中有可能数据不相等,可以声明两个变量@count1,@count2
DECLARE @Count1 int,@Count2 int
select @Count1 = COUNT(1) from Atable
select @Count2 = COUNT(1) from Btable
四: 根据@count1和@count2的大小判断是否新增还是删除
IF(@Count1 > @Count2)
BEGIN
SELECT * INTO Btable
from Atable as arul
left join Btable as aru
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
where aru.AppNumber is null and aru.RoleId is null and aru.EmployeeID is null
END
ELSE
BEGIN
update aru set aru.Status = 0
from Btable as aru
left join Atable as arul
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
where arul.AppNumber is null and arul.RoleId is null and arul.EmployeeID is null
END
数据量较多时,又比较、又更新、又新增时,利用循环特别费时,批量更新的效率是循环的几十倍甚至上百倍
个人工作中总结出来,如有转载请注明出处!
转载于:https://www.cnblogs.com/chengxiaofei2018/p/10065706.html
【优化SQL Server循环更新、插入耗时长的问题】相关推荐
- Sql Server 循环语句插入
有个表tt 描述为: q (PK,int,not null) w (nchar(10),not null) e (int,not null) r (int,not null) t (int,not n ...
- 优化SQL Server数据库查询方法
本文详细介绍了优化SQL Server数据库查询方法. SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...
- 五十种巧妙优化SQL Server数据库
五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...
- 50种方法巧妙优化SQL Server数据库(转载)
50种方法巧妙优化SQL Server数据库 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3. ...
- 应用事件探查器优化SQL Server系统[转]
应用事件探查器优化SQL Server系统 关键词:Mssql,,概述 当你的SQL Server数据库系统运行缓慢的时候,你或许多多少少知道可以使用SQL Server Profiler(中文叫SQ ...
- 优化SQL Server的内存占用之执行缓存
优化SQL Server的内存占用之执行缓存篇 优化SQL Server的内存占用之执行缓存 在论坛上常见有朋友抱怨,说SQL Server太吃内存了.这里笔者根据经验简单介绍一下内存相关的调优知识. ...
- sql server 循环_学习SQL:SQL Server循环简介
sql server 循环 Loops are one of the most basic, still very powerful concepts in programming – the sam ...
- 索引sql server_优化SQL Server索引策略
索引sql server 指数策略概述 (Index strategies overview) This article is about techniques for optimizing the ...
- 用Java向SQL Server数据库中插入float数据报错An error occurred while converting the Float value to JDBC data type
作者:翁松秀 用Java向SQL Server数据库中插入float数据报错 用Java向SQL Server数据库中插入float数据报错 报错信息: 报错原因: 解决方案: 报错信息: An er ...
最新文章
- java静态变量和实例变量的区别6_java静态变量的与实例变量的区别
- 【批处理学习笔记】第二十四课:直接传递
- 关于STL中的map和hash_map
- mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
- docker容器构建_我如何容器化构建系统
- matlab两张图片合成一张_二次曝光合成手机照片剪影照并不难,这样用snapseed轻松实现...
- php正则表达式2,php正则表达式基本语法(2)
- css无效 https_【CSS非全解02】CSS基础-文档流
- 使用python fabric搭建RHEL 7.2大数据基础环境以及部分优化
- 数据挖掘概念与技术(第三版)课后答案——第三章
- android模拟器快捷键,Android模拟器快捷键大全
- python中除法运算_python除法运算
- 关于『HTML』:第三弹
- SveletJs学习——运动动画
- 在keil中使用bdata型可位寻址全局变量
- Cook-Torrance/ Ward反射方程
- uni-app的生命周期说明及平台差异性说明
- X-Space系列进阶教程七之703N 740N 710N 720N 串口辅助刷机,救砖(转载)
- 市面常用芯片对应的ARM架构
- 人工智能、物联网时代,嵌入式思维的应用