日期:2014-05-18 浏览次数:20405 次
count(*)和count(1)是一样的
------解决方案--------------------
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。 count(1),其实就是计算一共有多少符合条件的行。 1并不是表示第一个字段,而是表示一个固定值。
------解决方案--------------------
count(*)与count(1)的对比 现在我们开始验证count(*)和count(1)的区别,验证方法很简单,如果两个语句执行效率不一样的话它们的查询计划肯定会不一样的,我们先执行set showplan_text on打开SQL执行计划显示,然后我们执行相应的SQL语句。 先是count(*): select count(*) from test /*--------------------------------------- ====== 下面是执行计划 ====== |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1005],0))) |--Stream Aggregate(DEFINE:([Expr1005]=Count(*))) |--Table Scan(OBJECT:([AdventureWorks].[dbo].[test])) --------------------------------------*/接着count(1): select count(1) from test /*--------------------------------------- ====== 下面是执行计划 ====== |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1005],0))) |--Stream Aggregate(DEFINE:([Expr1005]=Count(*))) |--Table Scan(OBJECT:([AdventureWorks].[dbo].[test])) --------------------------------------*/对比下两个执行计划我们可以发现是完全一样的,这也就说明count(*)和count(1)的执行效率是完全一样的,根本不存在所谓的单列扫描和多列扫描的问题。
------解决方案--------------------
sql语句正确的话,查询结果是一样的,但是经常用count(1),只要这两个效率的问题还得看情况,还得看什么数据库
参考
http://blog.163.com/bj_whj/blog/static/132129412011128113856421/
------解决方案--------------------
你这是ORACLE,具体是判断是否存在字段a和字段b相等的记录,如果存在删除掉new_table表。
------解决方案--------------------