只做必须做的
Doing Only What Is Required
开发者使用count(*)往往只是为了测试“是否存在”。这通常是由以下的需求说明引起的:
如果存在满足某条件的记录
那么处理这些记录
用代码直接实现就是:
select count(*)
into counter
from table_name
where <certain_condition>
if (counter > 0) then
当然,在 90% 的情况下,count(*) 是完全不必要的,正如上面的例子。要对多项记录进行操作,直接做即可,不必用count(*)。即使一个操作对任何记录都没有影响,也没有关系,不用count(*)没有什么不好。而且,即使要对未知的记录进行复杂处理,也能通过第一个操作就确定并返回受影响的记录——要么通过特殊的 API (例如 PHP 中的 mysql_affected_rows()),要么采用系统变量(Transact-SQL 中为@@ROWCOUNT,PL/SQL 中为SQL%ROWCOUNT),若使用内嵌式 SQL,则使用SQL通讯区(SQL Communication Area,SQLCA)的特殊字段。有时,可以通过函数访问数据库然后直接返回要处理的记录数,例如 JDBC 的executeUpdate()方法。总之,统计记录数极可能意味着重复全部搜索,因为它对相同数据处理了两次。
此外,如果是为了更新或插入记录(常使用count检查键是否已经存在),一些数据库系统会提供专用的语句(例如Oracle 9i 提供MERGE 语句),其执行效率要比使用count高得多。
总结:没必要编程实现那些数据库隐含实现的功能。






