仓酷云

标题: MYSQL网页设计SQLServer 优化SQL语句 in 和not in的替... [打印本页]

作者: 简单生活    时间: 2015-1-16 22:15
标题: MYSQL网页设计SQLServer 优化SQL语句 in 和not in的替...
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实行工夫要短良多了一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。
作者: 蒙在股里    时间: 2015-1-19 06:26
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
作者: 谁可相欹    时间: 2015-1-26 12:52
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
作者: 透明    时间: 2015-2-4 16:23
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
作者: 海妖    时间: 2015-2-10 04:07
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
作者: 活着的死人    时间: 2015-2-28 19:32
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
作者: 不帅    时间: 2015-3-10 07:08
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
作者: 深爱那片海    时间: 2015-3-17 05:10
可以动态传入参数,省却了动态SQL的拼写。
作者: 因胸联盟    时间: 2015-3-23 22:24
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2