перелік та замовлення таблиць за розміром


109

Як я можу перерахувати всі таблиці бази даних PostgreSQL та замовити їх за розміром ?


1
Якщо ви використовуєте клієнтський рядок клієнта psql, то простий \d+покаже вам цю інформацію, хоч і несортовану.
cdhowie

1
Дякую. Але мені це потрібно відсортовано, у мене занадто багато таблиць.
нічого особливого - ось

1
Люди, які шукають те саме, але не бази даних, а не таблиці: ось рішення .
Skippy le Grand Gourou

1
Re psql: запустіть його з -echo-приховано, і він повідомить вам запити, виконані для \ d + та інших зворотних косих команд. Сортування легко додати.
Юрген Стробель

Відповіді:


149
select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 2

Це показує вам розмір усіх таблиць у схемі, publicякщо у вас є кілька схем, можливо, ви хочете використовувати:

select table_schema, table_name, pg_relation_size('"'||table_schema||'"."'||table_name||'"')
from information_schema.tables
order by 3

Приклад SQLFiddle: http://sqlfiddle.com/#!15/13157/3

Перелік усіх функцій розміру об'єкта в посібнику .


Це table_schema, а не schema_name. Перший запит був добре, але ви вже почали щось набирати у своєму psql-сеансі, що спричинило синтаксичну помилку.
врожайність фальшивості

OK цей код працює: select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; дякую за допомогу!
нічого особливого - тут

будь-яка ідея, що це не працює в моєму випадку? stackoverflow.com/questions/40977776/…
Хуан Карлос Оропеза

@Sucrenoir: "не працює" не є дійсним повідомленням про помилку Postgres. Запит у моїй відповіді працює для мене: rextester.com/KGKPR49004
a_horse_with_no_name

Я отримую нульові рядки, коли запускаю перший запит. select * from information_schema.tables where table_schema = 'public';отримує нульові рядки, навіть не дивлячись на те, що \dnсхема відкрита. Може, зміна 9,5 спричинила це?
вівчарка

71

Це покаже вам ім'я схеми, ім'я таблиці, розмір досить і розмір (потрібний для сортування).

SELECT
  schema_name,
  relname,
  pg_size_pretty(table_size) AS size,
  table_size

FROM (
       SELECT
         pg_catalog.pg_namespace.nspname           AS schema_name,
         relname,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size

       FROM pg_catalog.pg_class
         JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
     ) t
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;

Я будую це на основі рішення з наведеного тут списку схем з розмірами (відносними та абсолютними) в базі даних PostgreSQL


21

Це буде зрозуміліше.

pg_size_pretty(<numeric_value>) - перетворює байти no.of у формат, прочитаний людиною.

pg_database_size(<db_name>)- отримує розмір бази даних у байтах .

pg_total_relation_size(<relation_name>)- отримує загальний розмір таблиці та її індекс у байтах .

pg_relation_size(<relation_name>)- отримує розмір співвідношення (таблиця / індекс) у байтах .

pg_index_size(<relation_name>)- отримує розмір індексу відношення в байтах .

current_database() - отримує поточно використану базу даних, над якою виконується цей запит.

Запит:

select current_database() as database,
       pg_size_pretty(total_database_size) as total_database_size,
       schema_name,
       table_name,
       pg_size_pretty(total_table_size) as total_table_size,
       pg_size_pretty(table_size) as table_size,
       pg_size_pretty(index_size) as index_size
       from ( select table_name,
                table_schema as schema_name,
                pg_database_size(current_database()) as total_database_size,
                pg_total_relation_size(table_name) as total_table_size,
                pg_relation_size(table_name) as table_size,
                pg_indexes_size(table_name) as index_size
                from information_schema.tables
                where table_schema=current_schema() and table_name like 'table_%'
                order by total_table_size
            ) as sizes;

Результат:

 database  | total_database_size | schema_name | table_name | total_table_size | table_size | index_size
-----------+---------------------+-------------+------------+------------------+------------+------------
 vigneshdb | 1586 MB             | corpdata    | table_aaa  | 16 kB            | 0 bytes    | 8192 bytes
 vigneshdb | 1586 MB             | corpdata    | table_bbb  | 24 kB            | 0 bytes    | 16 kB
 vigneshdb | 1586 MB             | corpdata    | table_ccc  | 640 kB           | 112 kB     | 488 kB
 vigneshdb | 1586 MB             | corpdata    | table_ddd  | 9760 kB          | 3152 kB    | 6568 kB
 vigneshdb | 1586 MB             | corpdata    | table_eee  | 1120 MB          | 311 MB     | 808 MB

Гуманізувати формат подання до bytes, kB, MB, GB, і TB.

bytesдо kB- починається від10240 bytes

bytesдо MB- починається від 10485248 bytes= 10239.5 kB~10 MB

bytesдо GB- починається від 10736893952 bytes= 10239.5 MB~10 BG

bytesдо TB- починається від 10994579406848 bytes= 10239.5 GB~10 TB

Усі перетворення одиниць починаються з 10 + <unit>.

Для довідки - Офіційна документація Postgres


Цей приклад не працює з великими іменами таблиці
Іван Свешніков


4
select table_name,n_live_tup, pg_size_pretty(pg_relation_size(table_name))
from information_schema.tables
inner join pg_stat_user_tables  on table_name=relname
where table_schema = 'public'
order by 2 desc

Ще одна альтернатива


2

Мені потрібно було знайти, які таблиці використовують найбільше місця.

На основі інших відповідей я використав цей запит:

select table_name, pg_size_pretty( pg_relation_size(quote_ident(table_name)) )
from information_schema.tables
where table_schema = 'public'
order by pg_relation_size(quote_ident(table_name)) desc

Я отримую такий результат:

table_name              pg_size_pretty
--------------------------------------
trade_binance           96 GB
closs_v2_binance_stash  46 GB
closs_bitfinex_stash    5725 MB
trade_bitfinex          5112 MB
...
api_requests            0 bytes
trade_huobi             0 bytes

Я повинен був купити більший SSD.


1
 select uv.a tablename, pg_size_pretty(uv.b) sizepretty 
 from (select tb.tablename a, pg_table_size('schemaname.'||tb.tablename::text) b 
        from pg_tables tb 
        where tb.schemaname ilike 'schemaname' 
        order by 2 desc
       ) uv

1
Ваша відповідь була б більш цінною, якщо ви додасте пояснення, чому запропонований підхід є корисним.
Сінді Майстер

Це схоже на відповідь коня, просто сортуючи за розмірами з досить гарним, оскільки вид сортування буде легко виглядати.
Спайк

Будь ласка, додайте цей текст до своєї відповіді, скориставшись посиланням Редагувати у просторі "Відповідь". Тоді ваш внесок відповідатиме правилам StackOverflow (читайте трохи у довідковому центрі) :-)
Сінді Майстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.