postgresql 尝试理解Postgres查询中临时表的作用域

roejwanj  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(1)|浏览(116)

this SO Answer about PostgreSQL and Temp tables中,他们这样描述临时表:
它只在当前 * 会话 * 中可见,并在会话结束时死亡。当使用ON COMMIT DROP创建时,它会在 transaction 结束时死亡。
给定一个类似这样的示例SQL:

CREATE TEMP TABLE temp1 AS
SELECT dataid
     , register_type
     , timestamp_localtime
     , read_value_avg
FROM   rawdata.egauge
WHERE  register_type LIKE '%gen%'
ORDER  BY dataid, timestamp_localtime;

这是否意味着我可以有一个查询,是运行多次 * 在同一时间 * 和每个查询运行..它有自己的范围。会有它自己的副本/版本 * 它的临时表?因此,query_1的临时表不会与query_2的临时表混淆,如果两者“同时”运行。
例如:
20个人“同时”请求同一个网页。然后,Web服务器对每个请求执行相同的查询,这意味着同时运行20个查询。(当然,每个请求的数据可能不同。等等)。
我的理解是否正确?有没有办法用pgAdmin 4测试一下?

83qze16e

83qze16e1#

根据文档Create Table
临时表存在于一个特殊的模式中,因此在创建临时表时不能给出模式名称。
使用psql

\dnS pg_temp_*
   List of schemas
   Name    |  Owner   
-----------+----------
 pg_temp_3 | postgres
 pg_temp_4 | postgres

这可能不是你所看到的。问题是Postgres可能已经创建了一些临时模式,以预期在其中创建临时表。否则,它将按需创建它们。

--Session 1
create temp table temp(id integer);
CREATE TABLE

select * from pg_temp_3.temp;
 id 
----
(0 rows)

--Session 2
create temp table temp(id integer);
CREATE TABLE

 select * from pg_temp_4.temp ;
 id 
----
(0 rows)

--Session 1
insert into temp values (1);
INSERT 0 1
select * from pg_temp_3.temp;
 id 
----
  1
(1 row)

--Session 2
insert into temp values (2);
INSERT 0 1
select * from pg_temp_4.temp ;
 id 
----
  2

因此,正如您所看到的,每个临时表都有自己的命名空间(模式),这就是每个会话/事务如何在自己的表版本上操作。为了证明这一点:

--Session 2
select * from pg_temp_3.temp ;
ERROR:  cannot access temporary tables of other sessions

另外,如果另一个会话创建了该表,会发生什么情况。

--Session 3
create temp table temp(id integer);

select * from pg_temp_5.temp ;
 id 
----
(0 rows)

insert into temp values (3);
INSERT 0 1
select * from pg_temp_5.temp ;
 id 
----
  3

创建另一个pg_temp_*模式来保存它。

相关问题