环境:Oracle11g
数据:一份一百万的数据
在Orcale中count(计数) 聚合函数是最常用的,但是也有count(*),count(1),count([列])的区别:
在网上看到的基本就是说
count(*) 是全表扫描。
count(1) 会过滤掉一整行为Null的行
一般表中是不会存在一整行的值都为空的(null)。如要查找一整行都为null的行数可用
select count(null) from TabelA
count([列]) 指定某一列扫描,会过滤掉该列为null的值
测试结果使用count(*),count(1),count(null),count(rowid)和count([列])都花了三十几秒,因为不存在空行,所以计数结果也一样。效率差别不大。
考虑到效率问题,可以使用主键列查询count([主键]),或在某一列上建立索引INDEX,然后使用count([索引列]),明显效率就提升了,一样的结果只花了一秒多时间。
分页查询:
1、使用Row_Number()
SELECT * FROM ( SELECT ROW_NUMBER() OVER (order by T.字段名)AS Rowss, T.* from 表名 T WHERE 条件 ) TT WHERE TT.Rowss between 开始 and 结束
必须要有order by 来作为行号标准
2、使用Rowid
SELECT * FROM (SELECT ROWNUM RN,RD FROM(SELECT ROWID RD FROM 表名 S WHERE 条件 ORDER BY S.字段)T WHERE ROWNUM<=结束)P,MP_MUILTNETREPORT A WHERE RN>=开始 AND P.RD=A.ROWID
排序字段order by可写可不写。
在Oracle11g中测试,数据量大时明显使用Rowid比Row_Number()快的多。