我有一个名为User的表,它有列uid,年龄等。 首先我运行\ d + User; 然后我可以看到它告诉我以下信息:
Indexes:
"users_pkey" PRIMARY KEY, btree (uid)
所以我知道uid被用作索引。 然后我用
SELECT COUNT(uid) FROM User;
获取索引数。
但有没有更好的方法,例如,我可以使用pg_class,pg_stats ......
答案 0 :(得分:0)
首先,user
is a reserved word。不要将它用作标识符。
“索引数”可能表示“行数”。
用于计算表中的所有行,index is only going to be useful, if it is considerably smaller than the table itself(在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 about counting。
答案 1 :(得分: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;
只需用适当的count语句替换select部分即可获得数字。
(注意:要使psql显示此类查询,请将其作为psql -E
运行。)