教你快速掌握SQL语句各种写法的效率问题
2008-10-08 15:11
471 查看
【赛迪网-IT技术报道】问题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') 解答: 第1种好一些,但也得有个量的控制,因为第1种的unionall是作为一个语句整体,查询优化器会尝试做优化,同时,也要先算出这个结果再插入的。 问题2: 赋值时: SELECT@a=N'aa' SET@a=N'aa' 上面两种方法,哪种方法效率高? 解答: 如果是单个赋值,没有什么好比较的话. 不过,如果是为多个变量赋值,经测试,SELECT一次性赋值,比用SET逐个赋值效率好.. 问题3:取前几条数据时 setROWCOUNT2select*fromtborderbyfd selectTop2*fromtborderbyfd 上面两种方法,哪种方法效率高? 答: SETROWCOUNT和TOP是一样的,包括执行的计划等都是一样的 问题4:条件判断时: where0<(selectcount(*)fromtbwhere……) whereexists(select*fromtbwhere……) 上面两种方法,哪种方法效率高? 答: 这个一般是exists快,当然,具体还要看你后面的子查询的条件,是否会引用外层查询中的对象的列. exists检查到有值就返回,而且不返回结果集,count需要统计出所有满足条件的,再返回一个结果集,所以一般情况下exists快. 问题5: (5)NULLIF的使用----->同理它的反函数ISNULL的使用 updatetbsetfd=casewhenfd=1thennullelsefdend updatetbsetfd=nullif(fd,1) 上面两种方法,哪种方法效率高? 答: 应该是一样的 问题6:从字符串中取子字符串时 substring('abcdefg',1,3) left('abcderg',3)_ 上面两种方法,哪种方法效率高? 答: 基本上是一样的 问题7:EXCEPT和Notin的区别? 答: except会去重复,notin不会(除非你在select中显式指定) except用于比较的列是所有列,除非写子查询限制列,notin没有这种情况 问题8:INTERSECT和UNION的区别? 答:intersect是两个查询都有的非重复值(交集),union是两个查询结果的所有不重复值(并集) |
通过两个例子讲解PIVOT/UNPIVOT的用法 |
发布时间:2008.03.1304:58来源:赛迪网作者:ChenJaYi |
【赛迪网-IT技术报道】使用过SQLServer2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQLServer2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。 在本文中我们将通过两个简单的例子详细讲解PIVOT/UNPIVOT的用法。 PIVOT的用法: 首先创建测试表,然后插入测试数据
|
用一个实例讲解GROUPBYCEIL的使用方法 |
发布时间:2008.01.3105:07来源:赛迪网作者:孙诗涵 |
GROUPBYCEIL的使用方法:
|