|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL数据库归MySQLAB公司所有,但是这个软件是开源的,有一个MySQL学习教程可以免费下载。稍俱常识的新入门者都可以轻松实现在一个常见硬件上安装和配置MySQL。可是用IN的SQL功能老是对照低的,从SQL实行的步骤来剖析用IN的SQL与不必IN的SQL有以下区分:
SQL试图将其转换成多个表的毗连,假如转换不乐成则先实行IN内里的子查询,再查询外层的表纪录,假如转换乐成则间接接纳多个表的毗连体例查询。因而可知用IN的SQL最少多了一个转换的历程。一样平常的SQL都能够转换乐成,但关于含有分组统计等方面的SQL就不克不及转换了。保举在营业麋集的SQL傍边只管不接纳IN操纵符
NOTIN此操纵是强列保举不利用的,由于它不克不及使用表的索引。保举用NOTEXISTS或(外毗连+判别为空)计划取代
在数据库中有两个表,一个是以后表Info(id,PName,remark,impdate,upstate),一个是备份数据表bakInfo(id,PName,remark,impdate,upstate),将以后表数据备份到备份表往,就触及到notin和in操纵了:
起首,增加10万条测试数据
复制代码代码以下:
createprocedureAddData
as
declare@idint
set@id=0
while(@id<100000)
begin
insertintodbo.Info(id,PName,remark,impdate,upstate)
values(@id,convert(varchar,@id)+0,abc,getdate(),0)
set@id=@id+1
end
execAddData
利用notin和in操纵:
复制代码代码以下:
SETSTATISTICSTIMEON
GO
--备份数据
insertintobakInfo(id,PName,remark,impdate,upstate)
selectid,PName,remark,impdate,upstatefromdbo.Info
whereidnotin(selectidfromdbo.bakInfo)
GO
SETSTATISTICSTIMEOFF
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=3毫秒。
SQLServer实行工夫:
CPU工夫=453毫秒,占用工夫=43045毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
--变动以后表形态
updateInfosetupstate=1whereidin(selectidfromdbo.bakInfo)
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=62毫秒,占用工夫=79毫秒。
SQLServer实行工夫:
CPU工夫=188毫秒,占用工夫=318毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
--删除以后表数据
deletefromInfowhereupstate=1andidin(selectidfromdbo.bakInfo)
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=183毫秒,占用工夫=183毫秒。
SQLServer实行工夫:
CPU工夫=187毫秒,占用工夫=1506毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
利用join毗连替换计划:
复制代码代码以下:
SETSTATISTICSTIMEON
GO
--备份数据
insertintobakInfo(id,PName,remark,impdate,upstate)
selectid,PName,remark,impdate,upstatefrom
(SELECTInfo.id,Info.PName,Info.remark,Info.impdate,Info.upstate,bakInfo.idASbakID
FROMInfoleftJOIN
bakInfoONInfo.id=bakInfo.id)ast
wheret.bakIDisnullandt.upstate=0
GO
SETSTATISTICSTIMEOFF;
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=247毫秒,占用工夫=247毫秒。
SQLServer实行工夫:
CPU工夫=406毫秒,占用工夫=475毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
--变动以后表形态
updateInfosetupstate=1
FROMInfoINNERJOIN
bakInfoONInfo.id=bakInfo.id
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=4毫秒,占用工夫=4毫秒。
SQLServer实行工夫:
CPU工夫=219毫秒,占用工夫=259毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
--删除以后表数据
复制代码代码以下:
deletefromInfo
FROMInfoINNERJOIN
bakInfoONInfo.id=bakInfo.id
whereInfo.upstate=1
此操纵实行工夫:
复制代码代码以下:
SQLServer剖析和编译工夫:
CPU工夫=177毫秒,占用工夫=177毫秒。
SQLServer实行工夫:
CPU工夫=219毫秒,占用工夫=550毫秒。
(100000行受影响)
SQLServer剖析和编译工夫:
CPU工夫=0毫秒,占用工夫=1毫秒。
能够看出利用join计划比利用notin和in实行工夫要短良多了一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。 |
|