在SQL中选择表。它们是如何存储的?

时间:2014-02-07 20:16:20

标签: sql postgresql session temp-tables

当我在PostgreSQL中运行脚本时,我通常会从psql执行以下操作:

my_database> \i my_script.sql

my_script.sql中的位置可能包含以下代码:

select a.run_uid, s.object_uid into temp_table from dt.table_run_group as a 
inner join dt.table_segment as s on a.group_uid = s.object_uid; 

在这种特殊情况下,我只对使用查询结果创建temp_table感兴趣。

这些结果是否在服务器上的磁盘中?在记忆中?表是永久存储的吗?

2 个答案:

答案 0 :(得分:2)

  • 临时表存储在RAM中,直到可用内存用完为止,此时它们会溢出到磁盘上。此处的相关设置为temp_buffers

  • 无论哪种方式,它们都会在会话期间生效,并在结束时自动删除。

  • 您也可以在事务结束时自动删除它们(ON COMMIT DROP)或随时手动删除它们。

  • 临时表仅对同一会话中的同一用户可见。其他人无法访问它 - 也不会与之发生冲突。

  • 始终使用CREATE TABLE tbl AS ...。不鼓励使用替代形式SELECT ... INTO tbl,因为它与plpgsql中的INTO子句冲突。

您的查询可能如下所示:

CREATE TEMP TABLE tbl AS
SELECT a.run_uid, s.object_uid
FROM   dt.table_run_group a 
JOIN   dt.table_segment   s ON a.group_uid = s.object_uid;

答案 1 :(得分:1)

SELECT INTO table ...CREATE TABLE table AS ...相同,后者会创建一个普通的永久表格。