-2

我有一个名为 User 的表,它有列 uid、age 等。首先我运行 \d+ User; 然后我可以看到它告诉我以下信息:

Indexes:
    "users_pkey" PRIMARY KEY, btree (uid)

所以我知道 uid 被用作索引。然后我用

SELECT COUNT(uid) FROM User;

获取索引的数量。

但是有没有更好的方法,例如,我可以使用 pg_class、pg_stats ...

4

2 回答 2

0

首先,user是一个保留字。永远不要将其用作标识符。

“索引数”可能是指“行数”。

为了计算表中的所有行,索引只有在它比表本身小得多的情况下才有用(在 Postgres 9.2 中使用仅索引扫描)。

您的查询:

SELECT COUNT(uid) FROM tbl;

uid实际上计算了在表中可以找到多少个非空值tbl- 这恰好与没有NULL值的列的(活动)行总数一致。如果您真的想计算行数,请改用:

SELECT COUNT(*) FROM tbl;

略短和更快。

如果基于上次 ANALYZE 运行的估计足够好,您可以查询系统目录:

SELECT reltuples FROM pg_class WHERE oid = 'my_schema.my_tbl'::regclass;

显然要快得多,因为只需要读取一行。有关计算行数的方法,请参阅Postgres Wiki 。

于 2013-11-05T22:05:18.480 回答
0

您可以从目录中获取表上的索引数:

SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),
  pg_catalog.pg_get_constraintdef(con.oid, true), contype, condeferrable, condeferred, c2.reltablespace
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
  LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x'))
WHERE c.oid = 'tablename'::regclass AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname;

只需将选择部分替换为适当的计数语句即可获得数字。

(注意:要使 psql 显示这种查询,请将其运行为psql -E。)

于 2013-11-05T22:29:44.953 回答