我有一个名为 User 的表,它有列 uid、age 等。首先我运行 \d+ User; 然后我可以看到它告诉我以下信息:
Indexes:
"users_pkey" PRIMARY KEY, btree (uid)
所以我知道 uid 被用作索引。然后我用
SELECT COUNT(uid) FROM User;
获取索引的数量。
但是有没有更好的方法,例如,我可以使用 pg_class、pg_stats ...
我有一个名为 User 的表,它有列 uid、age 等。首先我运行 \d+ User; 然后我可以看到它告诉我以下信息:
Indexes:
"users_pkey" PRIMARY KEY, btree (uid)
所以我知道 uid 被用作索引。然后我用
SELECT COUNT(uid) FROM User;
获取索引的数量。
但是有没有更好的方法,例如,我可以使用 pg_class、pg_stats ...
首先,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 。
您可以从目录中获取表上的索引数:
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
。)