2012-04-04 4 views
5

निम्नलिखित पोस्टग्रेज़ SQL क्वेरी सभी स्कीमा और उनके आकार और अनुक्रमणिका आकारों से सभी तालिकाओं को सूचीबद्ध करेगी। यदि एक टेबल सिर्फ एक सूचकांक तालिका है, तो यह 100% सूचकांक के रूप में दिखाई देगा।लिस्टिंग तालिका और अनुक्रमणिका आकार के लिए एक पोस्टग्रेस एसक्यूएल क्वेरी सरलीकृत करें?

SELECT schema, 
     name, 
     pg_size_pretty(CASE WHEN is_index THEN 0 ELSE s  END) AS size, 
     pg_size_pretty(CASE WHEN is_index THEN s ELSE st - s END) AS index, 
     CASE WHEN st = 0 THEN 0 
      WHEN is_index THEN 100 
          ELSE 100 - ((s*100)/st) END || '%' as ratio, 
     pg_size_pretty(st) as total 
    FROM (SELECT *, 
       st = s AS is_index 
      FROM (SELECT nspname as schema, 
         relname as name, 
         pg_relation_size(nspname || '.' || relname) as s, 
         pg_total_relation_size(nspname || '.' || relname) as st 
        FROM pg_class 
      JOIN pg_namespace ON (relnamespace = pg_namespace.oid)) AS p)               
    AS pp                 
ORDER BY st DESC LIMIT 30; 

यह निम्न परिणाम देगा:

schema   |   name   | size | index | ratio | total 
----------------+------------------------+---------+---------+-------+--------- 
public   | conf     | 4072 kB | 4360 kB | 52% | 8432 kB 
archive  | product_param   | 4048 kB | 3968 kB | 50% | 8016 kB             
public   | conf_pkey    | 0 bytes | 4320 kB | 100% | 4320 kB 
archive  | product_value   | 1568 kB | 1136 kB | 43% | 2704 kB 
public   | param_mapping   | 1472 kB | 832 kB | 37% | 2304 kB 
archive  | supplie_price   | 944 kB | 896 kB | 49% | 1840 kB 
public   | product_param_param_id | 0 bytes | 1552 kB | 100% | 1552 kB 
archive  | product_param_id  | 0 bytes | 1536 kB | 100% | 1536 kB 

मैं एक बिंदु है जहां मैं सभी से पूरी तस्वीर नहीं देख सकते हैं करने के लिए आ गया है, और यह थोड़ा बोझल पाने के लिए शुरू कर रहा है।

मुझे आश्चर्य है कि इसमें कुछ भी है जिसे सरल बनाया जा सकता है या अनावश्यक बनाया जा सकता है? अगर क्वेरी को अधिक सरल बनाया जा सकता है तो कॉलम जरूरी नहीं रहना चाहिए।

+0

यह भी देखें http://stackoverflow.com/questions/2596624/how-do-you-find-the-disk-size-of-a-postgres-postgresql- टेबल और अपनी अनुक्रमणिका। – Vadzim

उत्तर

3

मैं तुलनीय परिणाम (विभिन्न स्वरूपण के साथ) इस क्वेरी के साथ मिल redundunt किया जा रहा है:

select 
    nspname as schema, 
    relname as name, 
    pg_relation_size(pg_class.oid) as size, 
    pg_indexes_size(pg_class.oid) as index, 
    pg_total_relation_size(pg_class.oid) as total, 
    100 * case when relkind = 'i' then pg_relation_size(pg_class.oid) 
            else pg_indexes_size(pg_class.oid) end 
     /pg_total_relation_size(pg_class.oid) as i_ratio 
from 
    pg_class 
    join pg_namespace on relnamespace = pg_namespace.oid 
order by 5 desc 
+0

सुंदर मुद्रण के बिना यद्यपि। :-( –

+0

@AdamLindberg आप क्वेरी में बहुत आसानी से प्रिंटिंग जोड़ सकते हैं। मेरा मुख्य शोध बिंदु शामिल सामग्री और सबक्वायरी सामान का सरलीकरण था। –

+0

एकमात्र समस्या यह है कि 'pg_size_pretty (...)' ऑर्डर के बाद ऑर्डर करना सुंदर आकार के स्ट्रिंग वैल्यू के आधार पर, इस प्रकार 96 Kb> 960 Kb –

0

सबसे पहले क्यों सीटीई का उपयोग नहीं करना वे आपको कोड को और अधिक पठनीय बना देंगे। तो फिर तुम is_index नहीं लौटते तो यह

with p as (
SELECT nspname as schema, 
     relname as name, 
     pg_relation_size(nspname || '.' || relname) as s, 
     pg_total_relation_size(nspname || '.' || relname) as st 
    FROM pg_class 
     JOIN pg_namespace 
      ON (relnamespace = pg_namespace.oid) 
), 
pp as (
SELECT *, 
     case when st = s then 0 else s end as size, 
     case when st = s then s else st-s end as index 

    FROM p 
) 
select schema, 
     name, 
     pg_size_pretty(size) as size,   
     pg_size_pretty(index) as index, 
     (case st 
      when 0 then 0 
      else index*100/st 
     end) || '%' ratio, 
     st total 
from pp 
order by st desc limit 30; 
+0

यह वास्तव में सरल या छोटा नहीं है, आईएमओ। –

+0

मैबे आप सही हैं लेकिन इसे समझना आसान लगता है। मैंने इसे थोड़ा और बदल दिया है। – quzary

1

सभी मैं वास्तव में क्या करना चाहते हैं का कहना है कि है क्ज़री की प्रतिक्रिया ओड का उपयोग कर रही है और स्ट्रिंग्स नहीं बना रही है जो ओड के लिए वापस पार्स करने में असफल हो जाएंगी।

अब मैं एक उचित पोस्ट (शायद इस टिप्पणी करने से newbies रोक की बात है?) लिखने के लिए यहां एक और साफ किया और ऊपर prettied संस्करण है मिल गया है:

WITH p AS (
    SELECT n.nspname AS schema, 
     c.relname AS name, 
     pg_relation_size(c.oid) AS s, 
     pg_total_relation_size(c.oid) AS st 
    FROM pg_class c, pg_namespace n 
    WHERE c.relnamespace = n.oid 
) 
SELECT schema, name, 
    pg_size_pretty(s) AS size,   
    pg_size_pretty(st - s) AS index, 
    (100.0 * s/NULLIF(st, 0))::numeric(10,1) AS "% data of total", 
    st AS total 
FROM p 
ORDER BY st DESC 
LIMIT 30; 

नोट जोड़ने के लिए उपयोगी हो सकता है

AND c.relkind = 'r' 

p की WHERE खंड में: निम्न पंक्ति में। इससे इसे केवल संबंध/तालिकाओं तक सीमित कर दिया जाएगा और तालिका आकार के सामान्य सारांश के लिए कोड उपयोगी होगा।

0

और यह न भूलें कि pg_relation_size और pg_total_relation_size केस असंवेदनशील हैं!

pg_relation_size(nspname || '.' || relname) 

वास्तव में होना चाहिए:

pg_relation_size('"' || nspname || '.' || relname || '"') 

तो यह भी ऊपरी मामलों के साथ काम करता है। (मुझे यह पता लगाने में थोड़ी देर लग गई)

संबंधित मुद्दे