sql >> Base de Datos >  >> RDS >> PostgreSQL

Tamaño del índice de PostgreSQL y número de valor

pg_table_size('index_name') para el índice individual, pero solo le mostrará el tamaño en el disco, no la cantidad de datos

count(*) para obtener la cantidad exacta de filas actual

sum(pg_column_size(column_name)) from table_name para estimaciones sobre la cantidad de datos de la columna

puedes probar algo como:

t=# \di+ tbl*
                                    List of relations
 Schema |         Name         | Type  |  Owner   |     Table      |  Size  | Description
--------+----------------------+-------+----------+----------------+--------+-------------
 public | tbl_pkey  | index | postgres | tbl | 156 MB |
 public | tbl_unpic | index | postgres | tbl | 46 MB  |
 public | tbl_x1    | index | postgres | tbl | 57 MB  |
(3 rows)

t=# \dt+ tbl
                        List of relations
 Schema |      Name      | Type  |  Owner   | Size  | Description
--------+----------------+-------+----------+-------+-------------
 public | tbl | table | postgres | 78 MB |
(1 row)

t=# select pg_size_pretty(pg_total_relation_size('tbl'));
 pg_size_pretty
----------------
 337 MB
(1 row)

t=# select 78+57+46+156;
 ?column?
----------
      337
(1 row)

y para verificar cómo psql obtiene el tamaño del índice individual, ejecútelo con psql -E ..

y una vez más, las funciones anteriores funcionan con el tamaño que ocupa el disco, puede/(puede no) ser extremadamente diferente de la cantidad real de datos. pasar la aspiradora ayuda aquí

actualizar No sé de dónde obtiene directamente el número de "filas" en el índice, por lo tanto, solo puedo ofrecer una forma indirecta. Por ejemplo, permítanme tener un índice parcial, por lo que el "número de filas" es diferente de la tabla. Puedo verificar las estimaciones con EXPLAIN (por supuesto, debe repetir la cláusula where para eso) verificando rows=66800 en Index Only Scan using me da una idea del número de filas en ese índice (en realidad es rows=64910 que puede obtener explain analyze o simplemente ejecutando count(*) ). No puedo encontrar información relevante en pg_stats; tal vez haya alguna fórmula. No lo sé.