2017-08-28 33 views
0

創建的臨時表的大小I利用以下查詢在特定會話

Drop table if exists tmp_a; 
Create temp table tmp_a 
(
    id int 
); 

Insert into tmp_a select generate_series(1,10000); 

當我查詢和pg_stat_activity,它示出了作爲在current_query列「IDLE」爲上述會話創建一個臨時表。

我將使用此query從pg_class表中獲取所有臨時表的大小。 但我要爲特定的會話以及那些臨時表的大小,創建臨時表的列表,即如果我創造了從兩個不同的會話兩種溫度表那麼結果應該是像下面

procpid | temp table name | size | username  
12345 | tmp_a   | 20 | gpadmin  
12346 | tmp_b   | 30 | gpadmin 

請分享查詢如果任何人有它

+0

Greenplum的是**從Postgres的很**的不同(儘管它們分享一些非常古老的根)。你最近正在使用哪一個? –

+0

我認爲系統表對於postgresql和greenplum都是一樣的,比如pg_class和pg_stat_activity。所以我加了兩個。目前我正在使用postgresql。 –

回答

1

它實際上簡單比你想象 -
臨時架構namesapce相同會話ID -

所以......

SELECT 
    a.procpid as ProcessID, 
    a.sess_id as SessionID, 
    n.nspname as SchemaName, 
    c.relname as RelationName, 
    CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'i' THEN 'index' 
    WHEN 'S' THEN 'sequence' 
    WHEN 's' THEN 'special' 
    END as RelationType, 
    pg_catalog.pg_get_userbyid(c.relowner) as RelationOwner, 
    pg_size_pretty(pg_relation_size(n.nspname ||'.'|| c.relname)) as RelationSize 
FROM 
    pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
LEFT JOIN pg_catalog.pg_stat_activity a ON 'pg_temp_' || a.sess_id::varchar = n.nspname 
WHERE c.relkind IN ('r','s') 
AND (n.nspname !~ '^pg_toast' and nspname like 'pg_temp%') 
ORDER BY pg_relation_size(n.nspname ||'.'|| c.relname) DESC; 

,你會得到 -

processid | sessionid | schemaname | relationname | relationtype | relationowner | relationsize 
-----------+-----------+------------+--------------+--------------+---------------+-------------- 
     5006 |   9 | pg_temp_9 | tmp_a  | table  | gpadmin  | 384 kB 
     5006 |   9 | pg_temp_9 | tmp_b  | table  | gpadmin  | 384 kB 
(2 rows) 

讓我們把這個過程睡覺 - 和啓動另一個....

gpadmin=# 
[1]+ Stopped     psql 

[[email protected] ~]$ psql 
psql (8.2.15) 
Type "help" for help. 

gpadmin=# SELECT nspname 
FROM pg_namespace 
WHERE oid = pg_my_temp_schema(); 

nspname 
--------- 
(0 rows) 

gpadmin=# Create temp table tmp_a(id int); 
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table. 
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. 
CREATE TABLE 

gpadmin=# SELECT nspname 
FROM pg_namespace 
WHERE oid = pg_my_temp_schema(); 

nspname 
--------- 
pg_temp_10 
(1 row) 

... run the same query ... 

processid | sessionid | schemaname | relationname | relationtype | relationowner | relationsize 
-----------+-----------+------------+--------------+--------------+---------------+-------------- 
     5006 |   9 | pg_temp_9 | tmp_a  | table  | gpadmin  | 384 kB 
     5006 |   9 | pg_temp_9 | tmp_b  | table  | gpadmin  | 384 kB 
    27365 |  10 | pg_temp_10 | tmp_a  | table  | gpadmin  | 384 kB 
(3 rows) 
+0

我在那裏丟失了一些格式 - 您可以使用以下命令獲取當前的臨時模式:'pg_my_temp_schema();' –

+0

感謝您的信息 –