两张表更新

支持Acc

update 学号表 inner join 成绩表 on 学号表.学号=成绩表.学号 set 学号表.成绩=成绩表.成绩

数据表插入 Insert into A(c1,c2)select d1,d2 from D;

这次介绍一下T-SQL中“Not IN” 和“Not Exists”的优化。

Not IN Not Exists 命令 :

有些情况下,需要select/update/delete 操作孤立数据。孤立数据:不存在主表中而存在其关联表中。

操作这样的数据,一般第一反应是利用“Not in” 或 “Not Exists”命令。使用Not IN会严重影响性能,因为这个命令会逐一检查每个记录,就会造成资源紧张,尤其是当对大数据进行更新和删除操作时,可能导致资源被这些操作锁住。

选择NOT IN 还是 NOT Exists

现在SQL Server 中有两个命令可以使用大数据的插入、更新、删除操作,性能方面比NOT IN有很大的提高,语法简单比NOT Exists好很多,写出来的语句看上去很清爽。 现在就请它们闪亮登场,Merge 和 Except。

例子:

首先创建两个表

1 use [MyTest]
2 create table Test1 ([id] int, [name] varchar(20))
3 create table Test2 ([id] int, [name] varchar(20), [address] varchar(100))

1 declare @RowC int
2 declare @Name varchar(20)
3 set @RowC = 0
4 while @RowC < 400000
5 Begin
6 set @Name = 'TestName' + CAST(@RowC as varchar(10))
7 insert into Test1(id, name) values(@RowC, @Name)
8 set @RowC = @RowC+1
9 end

 1 declare @RowC int
 2 declare @Name varchar(20)
 3 declare @Address varchar(100)
 4 set @RowC = 0
 5 while @RowC < 500000
 6 Begin
 7 set @Name = 'TestName' + CAST(@RowC as varchar(10))
 8 set @Address = 'TestAddress' + CAST(@RowC as varchar(10))
 9 insert into Test2([id], [name], [address]) values(@RowC, @Name, @Address)
10 set @RowC = @RowC+1
11 end

使用Not IN命令Select/update/delete操作:

1 SELECT [name] FROM Test2 where [name] not in (select [name] from Test1)
2 UPDATE Test2 SET [name] =N'New_Name' where [name] not in (select [name] from Test1)
3 DELETE Test2 FROM Test2 where [name] not in (select [name] from Test1)

使用性能更好语法更简洁的Merge and Except

1 merge Test2 T using (select name from Test2 except select name from Test1 )S on t.name=s.name
2 when matched then update SET name=N'New_Name' ;
3 merge Test2 T using (select name from Test2 except select name from Test1 )S on t.name=s.name
4 when matched then delete ;
5 SELECT * FROM Test2 S where not exists (select 1 from Test2 inner join Test1 on Test2.name=Test1.name and Test2.name=s.name)

 

注意,上面还是有一部分使用了Not Exists:

1 SELECT name FROM Test2 S where not exists (select 1 from Test2 inner join Test1 on Test2.name=Test1.name and Test2.name=s.name)

现在需要使用简洁的Except:
1 select name from Test1 except select name from Test2

在这里只是给出了例子,没有拿出实际的对比数据。但是Merge 和Except 两个命令在大数据的处理方面的性能,要比

Not IN 好很多,代码简洁程度上,要比和Not EXISTS好很多。不管你信不信,反正我信了!!!

 

 上测试数据喽:Test1中有400000条数据,Test2中有500000条数据其中100000条数据的name是不同

Select Not IN:18秒

Select Except:几乎没有花费时间

Update Not IN: 19秒

Update Except、Merge:

删除操作和上面两个操作时间基本一样,在这里就不上图片了。

Not Exists性能上面并没有比except好多少。在我的测试数据上,两个几乎是在1秒以内完成操作的!!!

转载于:https://www.cnblogs.com/wzxflu/p/3548295.html

SQL 进行数据的更新和插入相关推荐

  1. SQL中数据的更新查询

    (一)数据更新 首先先建立一个表再进行数据的更新 插入一个新学生元组 插入一个学生的信息 此处应注意所插入的值要与属性列对应,否则会出现数据类型不匹配的错误 插入选课记录 此处应注意是否有外键约束,如 ...

  2. 【嗜血GO笔记】解决beego数据无法 更新和插入的问题

    今天在用beego 做数据插入的时候遇到一个问题,我的配置都正确,但是数据始终无法插入,后来开启log之后发现: must have one register DataBase alias named ...

  3. 第四章 数据库和SQL 4-3 数据的更新(UPDATE语句的使用方法)

    一.UPDATE语句的基本语法. 二.指定条件的UPDATE语句(搜索型UPDATE) 三.使用NULL进行更新 NULL清空:使用UPDATE可以将列更新为NULL,俗称NULL清空. 四.多列更新 ...

  4. 利用SQL语句对数据进行操作:插入、更新与删除数据行

    My目录 前言 一.T-SQL的组成 二.插入数据行 1.一次插入一行数据 2.一次插入多行数据 三.更新数据行 四.删除数据行 前言 结构化查询语言(Structured Query Languag ...

  5. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表

    1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...

  6. oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....

    该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,ins ...

  7. SQL基础操作_4_表的插入、更新、删除、合并操作

    目录 表的插入.更新.删除.合并操作 7.4.1 插入新的记录 7.4.2 插入含自增列的记录 7.4.3 插入新的多条记录 7.4.4 同时往多个表插入记录 7.4.5 通过其它表插入 7.4.6 ...

  8. 框架设计:实现数据的按需更新与插入的改进--用数据对比进一步说明

    在发布完:框架设计:实现数据的按需更新与插入的改进 之后: 有网友表示不理解,于是这里给出一篇简单的说明对比,表示下改进后好处. 一:场景一:循环5次,同样也是重复提交的问题 using (MActi ...

  9. 学习sql注入:猜测数据库_学习SQL:删除和更新数据SQL最佳实践

    学习sql注入:猜测数据库 Deleting and updating data is very common, but if performed without taking care, which ...

最新文章

  1. 微软服务器sql server,解析:微软SQL Server 2008特性和功能
  2. 80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!
  3. 对注册表项的访问被拒绝的解决
  4. 6-2 有序数组的插入 (20分)
  5. 09.QT应用程序启动外部exe文件
  6. python笔记06_进程vs线程
  7. 微信小程序_简单组件使用与数据绑定
  8. 使用docker分离服务与数据库
  9. 基于springboot的多人聊天系统
  10. java实现Tomasulo算法_并行计算机组成与设计pdf
  11. linux查看网络静态ip配置文件,linux 配置静态ip地址
  12. QT QComboBox使用详解
  13. 对云桌面、桌面云、私有云的一些看法
  14. 斯坦福大学公开课:乔布斯演讲
  15. ios string转dic_如何在Swift(iOS,Xcode)中将NSDictionary转换为Json String?
  16. 免费错别字检测、在线纠错工具
  17. Edison Chou
  18. 复兴号为什么不能超载?_接下来:什么都没有? 信息超载如何影响我们的大脑。...
  19. Day51:HEIL AI
  20. matlab 火柴人_小波分析检测信号奇异点matlab代码

热门文章

  1. 一个菜鸟从高一到大二的作品整理
  2. IA-32 Intel手册学习笔记(一)系统架构概述
  3. 搜索插入位置—leetcode35
  4. 乘积最大子数组—leedcode152
  5. |(与或移位等)的工程运用
  6. WriteFile写UNICODE字符串 TxT显示乱码
  7. 使用批处理查看.class文件内容--javap指令
  8. 人工智能的突破需要颠覆图灵机吗?
  9. 滑动窗口/二分 - 尽可能使字符串相等
  10. java6_64.tar配置_centos6.5_64 java 环境变量配置