Chinaunix

标题: 怎么统计数据库中每张表的记录的个数. [打印本页]

作者: 大蚂蚁    时间: 2005-12-14 18:13
标题: 怎么统计数据库中每张表的记录的个数.
数据库很多的表信息可以通过systables取得.
但是这个表中关于记录行数的统计是不准确的.因为手工 insert 进去的数据没有.
于是我根据systables中的 tabname字段执行

select  count(*) from tabname

来统计其记录数.

根据这个原理,我在shell里面写sql文件.

然后执行 dbaccess dbname mysqlfile>output.file

然而却看不到执行结果,可能写的有问题,各位有更高的方法取得表中记录数么? 谢谢
作者: heixin    时间: 2005-12-14 20:17
select count(*) from tabname

没有这么写的吧,from 后面应该跟个表名,除非你数据库里有个表的名字就是tabname,这句才可以执行

才疏学浅,没有聪明办法
1 把tabname字段从systables表中unload出来,形成文本
2 循环select count(*)
作者: ccnuboy    时间: 2005-12-14 20:48
我感觉楼上的做法不错,明天可以进行尝试!

不知道是否有更好的方法??
作者: 大蚂蚁    时间: 2005-12-14 21:18
原帖由 heixin 于 2005-12-14 20:17 发表
select count(*) from tabname

没有这么写的吧,from 后面应该跟个表名,除非你数据库里有个表的名字就是tabname,这句才可以执行

才疏学浅,没有聪明办法
1 把tabname字段从systables表中unload出来,形成文本 ...


你说的我当然都知道,也知道你的意思.而我的意思是,我想写一个脚本,一次性输出所有表的记录数.和对应是表名,我写的脚本不能执行

我写的sql文件的样式为

select count(*) from tabname1
select  count(*) from tabname2
.
.
.

当然,tabname是systables的,我SQL虽然不好,还是知道select怎么用的,可能是我发贴没表达清楚

然后执行 dbaccess dbname sqlfile>outputfile  结果里面只有一行

也就是说只能保存一个select的结果.

tabname有1000多个,我不可能象你所说的一个个去统计的吧,那样会累死人的,我还在想办法写脚本.
作者: john_student    时间: 2005-12-14 22:03
每个sql要用;分开. 或许是这个问题?
作者: ccnuboy    时间: 2005-12-14 23:20
加个分号,应该可以的...
作者: 大蚂蚁    时间: 2005-12-14 23:32
原帖由 john_student 于 2005-12-14 22:03 发表
每个sql要用;分开. 或许是这个问题?

我加了。。。,没加的话直接报错
发帖子又没发好

我想问下是不是 filelock 的问题导致后面的select的输出全部丢失了?如果是这样的话,我就要改用for循环了。唉~~
作者: sam_8286    时间: 2005-12-15 11:04
原帖由 大蚂蚁 于 2005-12-14 18:13 发表
数据库很多的表信息可以通过systables取得.
但是这个表中关于记录行数的统计是不准确的.因为手工 insert 进去的数据没有.

我觉得是不是update statistics一下就准了
作者: 大蚂蚁    时间: 2005-12-15 13:34
原帖由 sam_8286 于 2005-12-15 11:04 发表

我觉得是不是update statistics一下就准了

我查询systables 大于10行的表只有3个,FT

你说的操作在生产机上不允许做,不过问题我已经解决了,我用awk搞定select的输出结果了。
作者: lpz    时间: 2005-12-15 17:17
使用update statistics low对整个库作一下优化,然后查看systables的rows字段就可以得到准确结果;要不就编写脚本:
1、先倒出库结构,例如datadb;
2、编写shell,类似如下内容:
#!/bin/ksh  
for table in $(grep "TABLE" datadb.sql|awk '{print $3}'|awk -F"." '{print $2}')
do
print "Statistic $table...">>tabrows.log;
dbaccess datadb <>tabrows.log 2>&1
select count(*) from  $table;
EOF
done
查看tabrows.log搞定。
作者: 大蚂蚁    时间: 2005-12-15 17:46
原帖由 lpz 于 2005-12-15 17:17 发表
使用update statistics low对整个库作一下优化,然后查看systables的rows字段就可以得到准确结果;要不就编写脚本:
1、先倒出库结构,例如datadb;
2、编写shell,类似如下内容:
#!/bin/ksh  
for table in ...

生产机,不能做你所说的步骤的.我已经批量 select count(*) 搞定了 把输出结果用awk处理了
作者: yunzhongyue    时间: 2005-12-15 18:49
select "select" a,'"' b,tabname c,'"' i,',' h,"count(*) from " e,
tabname f,";" g
from systables
把结果的第一行去掉然后执行就OK了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2