คุณจะหาขนาดดิสก์ของตาราง Postgres / PostgreSQL ได้อย่างไรและดัชนีของมัน


156

ฉันกำลังจะไปที่ Postgres จาก Oracle และกำลังมองหาวิธีที่จะหาตารางและขนาดดัชนีในแง่ของbytes/MB/GB/etcหรือดีกว่าขนาดของตารางทั้งหมด ใน Oracle ฉันมีข้อความค้นหาที่น่ารังเกียจที่ดู user_lobs และ user_segments เพื่อให้คำตอบ

ฉันถือว่าใน Postgres มีบางอย่างที่ฉันสามารถใช้ได้ในinformation_schemaตาราง แต่ฉันไม่เห็นว่าอยู่ที่ไหน


คำตอบ:


271

ลองใช้ฟังก์ชั่นขนาดของวัตถุฐานข้อมูล ตัวอย่าง:

SELECT pg_size_pretty(pg_total_relation_size('"<schema>"."<table>"'));

สำหรับตารางทั้งหมดมีบางสิ่งตามแนวของ:

SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;

แก้ไข: ต่อไปนี้เป็นคำถามที่ส่งโดย @phord เพื่อความสะดวก:

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes;

ฉันแก้ไขมันเล็กน้อยเพื่อใช้pg_table_size()ในการรวมข้อมูลเมตาและทำให้ขนาดเพิ่มขึ้น


3
อนึ่งหากมีคนมีข้อมูลใด ๆ เกี่ยวกับวิธีการนามแฝงการแสดงออกใหญ่ซ้ำฉันยินดีที่จะได้ยินมัน
aib

2
คุณไม่สามารถใช้นามแฝงได้ แต่คุณสามารถเรียกใช้ในแบบสอบถามย่อย ... เช่น: SELECT table_full_name, pg_size_pretty (ขนาด) FROM (SELECT .. AS table_full_name, .. ขนาด AS จาก .... ) x เรียงตามขนาด
Magnus Hagander

1
ข้อเสนอแนะ: การเปลี่ยนแปลงไป'"' || table_schema || '"."' || table_name || '"' format('%I.%I', table_schema, table_name)
jpmc26

174

แสดงขนาดฐานข้อมูล:

\l+

เช่น

=> \l+
 berbatik_prd_commerce    | berbatik_prd     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 19 MB   | pg_default | 
 berbatik_stg_commerce    | berbatik_stg     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8633 kB | pg_default | 
 bursasajadah_prd         | bursasajadah_prd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1122 MB | pg_default | 

แสดงขนาดตาราง:

\d+

เช่น

=> \d+
 public | tuneeca_prd | table | tomcat | 8192 bytes | 
 public | tuneeca_stg | table | tomcat | 1464 kB    | 

psqlจะทำงานเฉพาะใน

(สรุปคำตอบของ@ zkutch )


28
หากต้องการดูทั้งตารางและดัชนี\dti+จะทำเคล็ดลับ
tomasz

คำตอบที่ได้จะเรียงตามขนาดจากมากไปหาน้อย
Izkata

23

ถ้าชื่อฐานข้อมูลเป็นsnortประโยคต่อไปนี้ให้มันขนาด:

psql -c "\l+ snort" | awk -F "|" '{print $7}'

2
คำตอบที่ง่ายที่สุดสำหรับการดูขนาดอย่างรวดเร็ว dbsizeฉันได้ใส่ฟังก์ชั่นนี้ในเปลือก
RichVel

12

พิมพ์สิ่งนี้: (สถิติขนาด / สถิติการใช้งาน)

SELECT
    t.tablename,
    indexname,
    c.reltuples AS num_rows,
    pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
    pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
    CASE WHEN indisunique THEN 'Y'
       ELSE 'N'
    END AS UNIQUE,
    idx_scan AS number_of_scans,
    idx_tup_read AS tuples_read,
    idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
           JOIN pg_class c ON c.oid = x.indrelid
           JOIN pg_class ipg ON ipg.oid = x.indexrelid
           JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
    ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;

10

ตาราง PostgreSQL มีสามองค์ประกอบ: ตารางตัวเอง, ดัชนีใด ๆ บนมัน, และข้อมูล TOAST ที่อาจเกิดขึ้น มีตัวอย่างสองสามตัวอย่างที่แสดงวิธีเลื่อนและลูกเต๋าข้อมูลที่มีอยู่หลายวิธีที่http://wiki.postgresql.org/wiki/Disk_Usage


5

สำหรับข้อมูลฉันได้รับคำตอบที่ยอดเยี่ยมจาก @ aib และแก้ไขมันเล็กน้อยเพื่อ:

  • รับเฉพาะตารางจากสคีมา "สาธารณะ"
  • แสดงข้อมูลมุมมองที่เป็นรูปธรรมและขนาดดัชนีด้วย

ในมุมมองที่ปรากฏขึ้นเราสามารถใช้ดัชนีเพื่อดูมุมมองที่ปรากฏใหม่พร้อมกันซึ่งอนุญาตให้ใช้ขณะที่อัปเดต

แบบสอบถามของฉันจะเป็นดังนี้:

SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        -- tables from 'public'
        SELECT table_name
        FROM information_schema.tables
        where table_schema = 'public' and table_type = 'BASE TABLE'
        union
        -- materialized views
        SELECT oid::regclass::text as table_name
        FROM pg_class
        WHERE relkind = 'm'
        order by table_name
    ) AS all_tables
    -- ORDER BY total_size DESC
    order by table_name
) AS pretty_sizes

1

ข้อความค้นหาด้านล่างจะให้บริการคุณ

SELECT nspname || '.' || relname AS "relation",
  pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  AND C.relkind <> 'i'
  AND nspname !~ '^pg_toast'
ORDER BY pg_total_relation_size(C.oid) DESC
LIMIT 20;

ดูลิงค์นี้: https://wiki.postgresql.org/wiki/Disk_Usage


0

ตรวจสอบวิกินี้ https://wiki.postgresql.org/wiki/Disk_Usage

SELECT *, pg_size_pretty (total_bytes) ทั้งหมด
    , pg_size_pretty (index_bytes) AS INDEX
    , pg_size_pretty (toast_bytes) AS ขนมปังปิ้ง
    , pg_size_pretty (table_bytes) เป็นตาราง
  จาก (
  SELECT *, total_bytes-index_bytes-COALESCE (toast_bytes, 0) AS table_bytes จาก (
      เลือก c.oid, nspname AS table_schema, relname AS TABLE_NAME
              , c.reltuples AS row_estimate
              , pg_total_relation_size (c.oid) AS total_bytes
              , pg_indexes_size (c.oid) AS index_bytes
              , pg_total_relation_size (reltoastrelid) AS toast_bytes
          จาก pg_class c
          ซ้ายเข้าร่วม pg_namespace n บน n.oid = c.relnamespace
          WHERE relkind = 'r'
  )
)

-1

ลองใช้สคริปต์นี้เพื่อค้นหาขนาดตารางทั้งหมด:

SELECT
    table_schema || '.' || table_name AS TableName,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS TableSize
FROM information_schema.tables
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC

สำหรับสคริปต์อื่น ๆ เพื่อค้นหาขนาดใน PostgreSQL โปรดไปที่ url นี้: http://www.dbrnd.com/2015/05/how-to-find-size-of-database-and-table-in-postgresql/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.