仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 795|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之SQL各类写法的效力成绩

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:24:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。成绩常常能够碰到这类情形:用分歧的SQL写法能够到达一样的目标。爱钻牛角尖的人就想弄分明,固然了局一样,但究竟孰优孰劣?上面是我列出的一些,请兄弟们见教。也请兄弟们将你们碰到的相似成绩一并列出。
(1)一次拔出多条数据时:
CREATETABLEtb(IDint,称号NVARCHAR(30),备注NVARCHAR(1000))
INSERTtbSELECT1,DDD,1
UNIONALLSELECT1,5100,D
UNIONALLSELECT1,5200,E

也能够如许:
CREATETABLEtb1(IDint,称号NVARCHAR(30),备注NVARCHAR(1000))
INSERTTB1(ID,称号,备注)VALUES(1,DDD,1)
INSERTTB1(ID,称号,备注)VALUES(1,5100,D)
INSERTTB1(ID,称号,备注)VALUES(1,5200,E)
_________________________________
下面两种办法,哪一种办法效力高?

(2)赋值时:
SELECT@a=Naa
SET@a=Naa
_________________________________
下面两种办法,哪一种办法效力高?

(3)取前几条数据时
setROWCOUNT2select*fromtborderbyfd
selectTop2*fromtborderbyfd
_________________________________
下面两种办法,哪一种办法效力高?

(4)前提判别时
where0<(selectcount(*)fromtbwhere……)
whereexists(select*fromtbwhere……)
_________________________________
下面两种办法,哪一种办法效力高?

(5)NULLIF的利用----->同理它的反函数ISNULL的利用
updatetbsetfd=casewhenfd=1thennullelsefdend
updatetbsetfd=nullif(fd,1)
_________________________________
下面两种办法,哪一种办法效力高?

(6)从字符串中取子字符串时
substring(abcdefg,1,3)
left(abcderg,3)_
________________________________
下面两种办法,哪一种办法效力高?

(7)EXCEPT和Notin的区分?
(8)INTERSECT和UNION的区分?
上面是邹老迈的回覆:


(1)一次拔出多条数据时:
第1种好一些,但也得有个,由于第1种的unionall是做为一个语句全体,查询优化器会实验做优化,同时,也要先算出这个了局再拔出的.

2.假如是单个赋值,没有甚么比如较的话.
不外,假如是为多个变量赋值,我测试过,SELECT一次性赋值,比用SET逐一赋值效力好.

3.SETROWCOUNT和TOP是一样的,包含实行的企图等都是一样的
4.这个通常为exists快,固然,详细还要看你前面的子查询的前提,是不是会援用外层查询中的工具的列.
exists反省到有值就前往,并且不前往了局集,count必要统计出一切满意前提的,再前往一个了局集,以是一样平常情形下exists快.
5.应当是一样的

6.基础上是一样的
7.except会往反复,notin不会(除非你在select中显式指定)
except用于对照的列是一切列,除非写子查询限定列,notin没有这类情形
8.intersect是两个查询都有的非反复值(交集),union是两个查询了局的一切不反复值(并集)



但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?
分手快乐 该用户已被删除
沙发
发表于 2015-1-19 10:57:57 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
再见西城 该用户已被删除
板凳
发表于 2015-1-26 23:30:04 | 只看该作者
大家注意一点。如下面的例子:
灵魂腐蚀 该用户已被删除
地板
发表于 2015-2-5 00:32:30 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-11 00:16:07 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
第二个灵魂 该用户已被删除
6#
发表于 2015-3-1 18:51:57 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
谁可相欹 该用户已被删除
7#
发表于 2015-3-10 22:10:54 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
8#
发表于 2015-3-17 11:10:34 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 05:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表