不用count(*)而知总记录的方法

taidixjh 2003-09-19 10:35:32
当一个表的数据量相当大时(至少几十万条记录),
如果用
select count(*) as num_Q from table_name
这样的语句需花几秒钟的时间。
能用其他的方法实现吗(数据库的花销时间要少!!)?

谢谢啦
...全文
104 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tom_Tan 2003-09-23
  • 打赏
  • 举报
回复
ANALYZE TABLE tablename ESTIMATE STATISTICS;
SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='tablename'
kidron 2003-09-23
  • 打赏
  • 举报
回复
对于触发器,当DELETE时如何确定该表的条数?
对于删除,如果批量删除,触发器该如何写?
kidron 2003-09-23
  • 打赏
  • 举报
回复
ANALYZE TABLE tablename ESTIMATE STATISTICS;

太不准确了,3万条记录就有几百条误差了
kidron 2003-09-23
  • 打赏
  • 举报
回复
哦,问题找到了,是表名大小写的问题哈
三杯倒 2003-09-23
  • 打赏
  • 举报
回复
count()和索引没有关系

作ANALYZE开销大
难道trigger开销小么

看你是什么需求
ANALYZE是静态的,而trigger是动态计算的
kidron 2003-09-23
  • 打赏
  • 举报
回复
为什么我在做以上测试时,SELECT 出的结果是空?
北极星2013 2003-09-23
  • 打赏
  • 举报
回复
同意小人物的说法
dajian2000 2003-09-22
  • 打赏
  • 举报
回复
不过上面这个开销比较大,而且不精确!

black_snail(●龙飞虎○)的第一种方法你可以试一下!
dajian2000 2003-09-22
  • 打赏
  • 举报
回复
SQL> desc user_tables
名称 空? 类型
----------------------------------------- -------- ----------------
TABLE_NAME NOT NULL VARCHAR2(30)
TABLESPACE_NAME VARCHAR2(30)
CLUSTER_NAME VARCHAR2(30)
IOT_NAME VARCHAR2(30)
PCT_FREE NUMBER
PCT_USED NUMBER
INI_TRANS NUMBER
MAX_TRANS NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
FREELISTS NUMBER
FREELIST_GROUPS NUMBER
LOGGING VARCHAR2(3)
BACKED_UP VARCHAR2(1)
NUM_ROWS NUMBER --表中的记录数
BLOCKS NUMBER
EMPTY_BLOCKS NUMBER
AVG_SPACE NUMBER
CHAIN_CNT NUMBER
AVG_ROW_LEN NUMBER
AVG_SPACE_FREELIST_BLOCKS NUMBER
NUM_FREELIST_BLOCKS NUMBER
DEGREE VARCHAR2(10)
INSTANCES VARCHAR2(10)
CACHE VARCHAR2(5)
TABLE_LOCK VARCHAR2(8)
SAMPLE_SIZE NUMBER
LAST_ANALYZED DATE
PARTITIONED VARCHAR2(3)
IOT_TYPE VARCHAR2(12)
TEMPORARY VARCHAR2(1)
NESTED VARCHAR2(3)
BUFFER_POOL VARCHAR2(7)

SQL> select count(*) from zhj;

COUNT(*)
----------
10

SQL> analyze table zhj compute statistics;

表已分析。

SQL> select num_rows from user_tables where table_name='ZHJ';

NUM_ROWS
----------
10
black_snail 2003-09-22
  • 打赏
  • 举报
回复
in a extremly case ,

1. create a trigger on that table , while inserting and delete , update the record number in another auditing table .

so you just fetch the nunmber in the auditing table .

2. analyze your table and you can get the row number from user_tables
more_zou 2003-09-22
  • 打赏
  • 举报
回复
在有索引那列使用count试试
mosaic 2003-09-22
  • 打赏
  • 举报
回复
我想至少得遍历一次吧,都差不多。
ipv 2003-09-19
  • 打赏
  • 举报
回复
select max(rownum) from table
会少吗?

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧