SQL Server用NOT EXISTS或(外连接+判断为空)方案实例

  用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从SQL执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:

  SQL试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐在业务密集的SQL当中尽量不采用IN操作符

  NOT IN 此操作是强列推荐不使用的,因为它不能应用表的索引。推荐用NOT EXISTS 或(外连接+判断为空)方案代替

  在数据库中有两个表,一个是当前表Info(id,PName,remark,impdate,upstate),一个是备份6184.html">数据表bakInfo(id,PName,remark,impdate,upstate),将当前表">数据备份到备份表去,就涉及到not in 和in 操作了:

  首先,添加10万条测试数据

create procedure AddData
as
declare @id int
set @id=0
while(@id<100000)
begin
    insert into dbo.Info(id,PName,remark,impdate,upstate)
    values(@id,convert(varchar,@id)+'0','abc',getdate(),0)
    set @id=@id+1
end

exec AddData

  使用not in 和in操作:

SET STATISTICS TIME ON
GO
--备份数据
insert into bakInfo(id,PName,remark,impdate,upstate)
select id,PName,remark,impdate,upstate from dbo.Info
where id not in(select id from dbo.bakInfo)
GO
SET STATISTICS TIME OFF  此操作执行时间:

SQL Server 分析和编译时间:
   CPU 时间 = 0 毫秒,占用时间 = 3 毫秒。

SQL Server 执行时间:
   CPU 时间 = 453 毫秒,占用时间 = 43045 毫秒。

(100000 行受影响)
SQL Server 分析和编译时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

  --更改当前表状态
update  Info set upstate=1 where id in(select id from dbo.bakInfo)
  此操作执行时间:

SQL Server 分析和编译时间:
   CPU 时间 = 62 毫秒,占用时间 = 79 毫秒。

SQL Server 执行时间:
   CPU 时间 = 188 毫秒,占用时间 = 318 毫秒。

(100000 行受影响)
SQL Server 分析和编译时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

  --删除当前表数据
delete from Info where upstate=1 and id in(select id from dbo.bakInfo)
  此操作执行时间:

SQL Server 分析和编译时间:
   CPU 时间 = 183 毫秒,占用时间 = 183 毫秒。

SQL Server 执行时间:
   CPU 时间 = 187 毫秒,占用时间 = 1506 毫秒。

(100000 行受影响)
SQL Server 分析和编译时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

时间: 2024-11-02 16:51:05

SQL Server用NOT EXISTS或(外连接+判断为空)方案实例的相关文章

怎样才能限制SQL Server只能让指定的机器连接(转)

server Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?(v1.0 19.10.1998) 怎样才能限制我的SQL Server只能让指定的机器连接 A. SQL Server has no built-in tools/facilities to do this. It also does not have the facility to ru

怎样才能限制SQL Server只能让指定的机器连接

server Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?(v1.0 19.10.1998) 怎样才能限制我的SQL Server只能让指定的机器连接 A. SQL Server has no built-in tools/facilities to do this. It also does not have the facility to ru

限制SQL Server只能让指定的机器连接

server Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?(v1.0 19.10.1998) 怎样才能限制我的SQL Server只能让指定的机器连接 A. SQL Server has no built-in tools/facilities to do this. It also does not have the facility to ru

使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题

原文 使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题 最近帮客户写了一个.net商城网站的发布接口,大家都知道.net一般都使用MSSQL数据库,但鱼丸不会.net呀,没办法,只能使用PHP连接SQL Server,然后来发布商品数据.因为客户采集的英文网站,但是要求发布时翻译成德语,发布完了,结果发现标题内容这些地方有乱码,在网上找了大半天,也试了很多种方法,结果使用SQLSRV解决了问题! 官方网址:http://msdn.microsoft.com

sql2005-高人救我,sql server 2005 数据库不时无法远程连接

问题描述 高人救我,sql server 2005 数据库不时无法远程连接 说明:关于我这个问题,我穷究了好几天,网上几乎所有相关问题的方法我都试过了,仍然没有解决.特来C论坛请教高手,万望各位不吝赐教.新来的,无C币,悬赏C币只有一个,仅代表我的一点感激之情,请勿见笑. 情况:asp + sql 2005,用的动易siteweaver 6.8 asp cms系统,一台web服务器,一台数据服务器,两台机器直连组的局域网. 问题:直接在数据服务器上连接数据库,一直都正常,在web服务器上通过内网

怎么才能限制SQL Server只能让指定的机器连接_oracle

正在看的ORACLE教程是:怎么才能限制SQL Server只能让指定的机器连接. Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?(v1.0 19.10.1998) 怎样才能限制我的SQL Server只能让指定的机器连接 A. SQL Server has no built-in tools/facilities to do this. It al

SQL Server实现用触发器捕获DML操作的会话信息【实例】

需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢? 解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,Host_Name.Program_Name等 ,选择触发器是因为

SQL Server中的完整性和外键

server 所谓完整性就是数据库中数据的一致性及有效性通常的说法有实体(行)完整性,域(列)完整性,及参考完整性(参考SQL Server). 实体完整性定义表中的所有行能唯一的标识,一般用主键,唯一索引 UNIQUE关键字,及IDENTITY属性比如说我们的身份证号码,可以唯一标识一个人. 域完整性通常指数据的有效性,限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值. 参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,比如图书管理

SQL Server 2005建立与服务器的连接时出错的解决方案

  打开新安装好的网站后却显示了如下错误: 在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败. (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错) 解决办法: 1.在"外围配置"工具把"仅TCP/IP"选上. 2.然后从"配置管理器"中找到"...2005网络配置"->"