2017-08-28 63 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

感谢您的信息 –