【问题标题】:Select into tables in SQL. How are they stored?在 SQL 中选择到表中。它们是如何存储的?
【发布时间】:2014-02-07 20:16:19
【问题描述】:

当我在 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 感兴趣。

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

【问题讨论】:

  • 您显示的表单中的查询(带有into temp_table 部分)应将查询的整个输出存储到表temp_table 中,并且不会将结果输出到psql。跨度>

标签: sql postgresql session temp-tables


【解决方案1】:
  • 临时表存储在 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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 太棒了。谢谢!有什么方法可以创建一个临时表,以便在我断开连接时将其销毁?这些表会作为常规表存储在数据库中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    相关资源
    最近更新 更多