经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的。爱钻牛角尖的人就想搞明白,诚然结果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教。也请兄弟们将你们遇到的类似问题一并列出。 (1)一次插入多条数据时: 也可以这样: (2)赋值时: (3)取前几条数据时 (4)条件判断时 (5)NULLIF的使用—–>同理它的反函数ISNULL的使用 (6)从字符串中取子字符串时 (7)EXCEPT和Not in的区别? (8)INTERSECT和UNION的区别? http://blog.knowsky.com 第1种好一些, 但也得有个, 因为第1种的union all是做为一个语句整体, 查询优化器会尝试做优化, 同时, 也要先算出这个结果再插入的. 4. 这个一般是exists快, 当然, 具体还要看你后面的子查询的条件, 是否会引用外层查询中的对象的列. 5. 应该是一样的 7. except会去重复, not in 不会(除非你在select中显式指定)
CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))
INSERT tb SELECT 1,DDD,1
UNION ALL SELECT 1,5100,D
UNION ALL SELECT 1,5200,E
CREATE TABLE tb1(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))
INSERT TB1 (ID,名称,备注)VALUES(1,DDD,1)
INSERT TB1 (ID,名称,备注)VALUES(1,5100,D)
INSERT TB1 (ID,名称,备注)VALUES(1,5200,E)
_________________________________
上面两种方法,哪种方法效率高?
SELECT @a=Naa
SET @a=Naa
_________________________________
上面两种方法,哪种方法效率高?
set ROWCOUNT 2 select * from tb order by fd
select Top 2 * from tb order by fd
_________________________________
上面两种方法,哪种方法效率高?
where 0<(select count(*) from tb where ……)
where exists(select * from tb where ……)
_________________________________
上面两种方法,哪种方法效率高?
update tb set fd=case when fd=1 then null else fd end
update tb set fd=nullif(fd,1)
_________________________________
上面两种方法,哪种方法效率高?
substring(abcdefg,1,3)
left(abcderg,3)_
________________________________
上面两种方法,哪种方法效率高?
下面是邹老大的回答:
(1)一次插入多条数据时:
2. 如果是单个赋值, 没有什么好比较的话.
不过, 如果是为多个变量赋值, 我测试过, SELECT 一次性赋值, 比用SET 逐个赋值效率好.
3. SET ROWCOUNT和TOP 是一样的, 包括执行的计划等都是一样的
exists检查到有值就返回, 而且不返回结果集, count需要统计出所有满足条件的, 再返回一个结果集, 所以一般情况下exists快.
6. 基本上是一样的
except用于比较的列是所有列, 除非写子查询限制列, not in 没有这种情况
8. intersect是两个查询都有的非重复值(交集), union是两个查询结果的所有不重复值(并集)
sql各种写法的效率问题_数据库技巧
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » sql各种写法的效率问题_数据库技巧
相关推荐
-      sql语句中的判断功能的使用方法
-      sql语句中的判断功能的使用方法
-      SQL语言中去掉小数点有效数字后面的所有0
-      ASP连接各种数据库的代码
-      在sql语句中实现md5功能
-      给access数据库减肥
-      asp连接access数据库代码(2)
-      ASP连接access数据库代码