【发布时间】:2015-04-15 13:56:23
【问题描述】:
Sybase ASE 中是否有存储所有用户表的行数的系统表?我想避免计数(*)。我知道我们在使用 sp_help 时会获得行数。所以认为它必须存储在任何系统表中。
【问题讨论】:
Sybase ASE 中是否有存储所有用户表的行数的系统表?我想避免计数(*)。我知道我们在使用 sp_help 时会获得行数。所以认为它必须存储在任何系统表中。
【问题讨论】:
我没有在 Sybase 中使用过这个功能,但是 Sybase 与 SQL Server 非常相似。仔细阅读documentation,似乎该字段位于systabstats.rowcnt 中。这将导致如下查询:
select o.name, s.rowcnt
from systabstats s join
sysobjects o
on s.id = o.id
where s.indid = 0;
我想这个列是一个近似值,在高交易环境中可能会关闭。
【讨论】:
您不应使用 systabstats.rowcnt 列:此信息取决于统计信息是否已更新。在针对 sysindexes 的查询中使用 row_count() 函数要好得多。与 systabstats 不同,此信息是自动维护的。只有当表上发生插入/删除活动时,此函数返回的结果才能暂时关闭少量行。
至于 MSSQL Server 仍然与 Sybase ASE 相似:从表面上看确实如此。 Microsoft 对内部进行了许多更改,因此这两个数据库在幕后大不相同。统计数据和存储(我们在上面讨论过)之类的东西属于这一类。
【讨论】:
如果您运行的是 15.0 之前的 SybaseASE,那么
SELECT o.name,
ROWCNT(i.doampg) as ROW_COUNT
FROM sysobjects o,
sysindexes i
WHERE o.id = i.id
AND o.sysstat2 & 1024 = 0 -- not remote
AND o.sysstat2 & 2048 = 0 -- not proxy
AND (i.indid = 0 OR i.indid = 1) -- Heap or ClustIdx only
--AND ROWCNT(i.doampg) > 1000 -- only need for tables having more than 1000 rows
AND o.type = 'U' -- exclude system tables
ORDER BY o.name
如果您运行的是 sybase 15.0 及更高版本,则可以使用ROW_COUNT() 函数;
SELECT name,
ROW_COUNT(DB_ID(), id)
FROM sysobjects
WHERE type = "U"
AND sysstat2 & 1024 = 0 -- not remote
AND sysstat2 & 2048 = 0 -- not proxy
ORDER BY name
【讨论】:
您可以使用 sysindexes (ase15) 中的 systabstats.rowcnt 或 row_count (i.doampg)
【讨论】: