有没有一种简单的方法来查找表的索引数?

时间:2013-11-05 21:48:35

标签: sql postgresql count indexing

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

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

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

SELECT COUNT(uid) FROM User;

获取索引数。

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

2 个答案:

答案 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运行。)