免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1604 | 回复: 0
打印 上一主题 下一主题

SELECT COUNT使用优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:53 |只看该作者 |倒序浏览
SQL 语句的COUNT有两种用途
1. 用来计算行数——Count(*)
2. 用来计算某个值的数量——COUNT(col1)
Count(*) 永远返回的都是结果集中的行数,而COUNT(col1)只返回col1值非空的记录数,如果col1值全部非空,
Count(*)和COUNT(col1)的结果是相同的。

Count的用法很简单,可在实际开发过程中还是能找到使用不那么精确的地方
很多时候我们会利用Count(*)来检查是否存在满足条件的数据,例如删除一个用户角色的时候,会通过
/****************************************************************************************************/
select count(*) from tbl_user_role user_role where user_role.role_id=#roldId#
/****************************************************************************************************/
来判断是否用户角色是否因被某个用户引用而不能删除。其实,我们的业务只要求确认是否有满足的条件的记录存在,而根本不关心满足记录的数量。select count(*)在这个例子中的用法会导致不必要的磁盘扫描和记录检索。正确的写法应该是
/*************************************Mysql***************************************************************************/
select exists (select * from tbl_user_role user_role where user_role.role_id=10 limit 1) 
/*************************************Mysql***************************************************************************/

/*************************************Oracle***************************************************************************/
select count(*) from dual where exists (select * from tbl_user_role user_role where user_role.role_id=10 and rownum=1) 
/*************************************Oracle***************************************************************************/

写法可能有多种,原理很简单,就是只找到符合记录的第一条就终止查询。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP