postgresql 中的临时表在所有客户端会话中都可见吗?
Posted
技术标签:
【中文标题】postgresql 中的临时表在所有客户端会话中都可见吗?【英文标题】:Are temporary tables in postgresql visible over all client sessions? 【发布时间】:2017-05-01 22:08:32 【问题描述】:我想创建一个临时表,以便能够将它连接到几个表,因为将这些表与建议的临时表的内容连接起来需要很多时间(获取临时表的内容很耗时.一遍又一遍地重复它需要越来越多的时间)。当我的需要完成时,我将删除临时表。 我想知道这些临时表是否会在其他客户端会话中可见(我的要求是使它们仅对当前客户端会话可见)。我正在使用postgresql。如果您能提出更好的替代方案来替代我正在考虑的解决方案,那就太好了。
【问题讨论】:
你有两个很好的答案,但也要记住,在 postgresql 中临时表很少使用。总有更好的方法 你能建议我采取什么其他方法吗?我尝试使用 CTE,但 CTE 中的数据没有存储,因此它们不会显着提升性能(在某些情况下,如我的,它们会降低性能)。 如果您对性能有疑问,请阅读postgresql-performance,然后使用标签信息中列出的所有信息提出一个新问题 如果您有具体问题,请在查询、解释分析输出和表格结构中发布问题(全部为格式化文本,请不要图像) 【参考方案1】:那么 PostgreSQL 就是你的数据库。临时表做得比标准好。来自the docs,
虽然
CREATE TEMPORARY TABLE
的语法与SQL 标准的语法相似,但效果却不尽相同。在标准中,临时表只定义一次,并在每个需要它们的会话中自动存在(从空内容开始)。 PostgreSQL 要求每个会话为每个要使用的临时表发出自己的CREATE TEMPORARY TABLE
命令。这允许不同的会话将相同的临时表名称用于不同的目的,而标准的方法将给定临时表名称的所有实例限制为具有相同的表结构。
【讨论】:
感谢 Evan 的回复。实际上,我对这些会话真正指的是什么感到困惑。这些数据库会话还是客户端会话,因为数据库会话可以跨越多个客户端会话,并且该表是否对对每个客户端(不是数据库客户端)的整个数据库会话,对我没有好处。 没有客户端会话的概念。只有数据库会话。如果您的客户端正在池连接,这可能实际上是一个问题。这是你要考虑的事情。数据库无法查看您的客户端会话概念。【参考方案2】:请阅读the documentation。
临时表仅在当前会话中可见,并在数据库会话结束时自动删除。
如果您指定ON COMMIT
,临时表将在当前事务结束时自动删除。
如果您需要在临时表上获得良好的表统计信息,则必须显式调用ANALYZE
,因为这些统计信息不会自动收集。
【讨论】:
感谢 Launrenz 的回复。实际上,我对这些会话真正指的是什么感到困惑。这些数据库会话还是客户端会话,因为数据库会话可以跨越多个客户端会话,并且表对于对每个客户端(不是数据库客户端)的整个数据库会话,对我没有好处。 这是一个数据库会话。如果您使用某种连接池,您要么必须在完成后显式删除临时表,要么在单个事务中完成工作并将ON COMMIT
与临时表一起使用。【参考方案3】:
默认情况下,临时表仅对当前会话可见,并且在提交或关闭该事务后会自动删除临时表,因此您无需显式删除。
自动清理守护程序无法访问,因此无法清理或分析临时表。因此,应通过会话 SQL 命令执行适当的清理和分析操作。例如,如果要在复杂查询中使用临时表,明智的做法是在填充临时表后对其运行 ANALYZE。
可选地,GLOBAL 或 LOCAL 可以写在 TEMPORARY 或 TEMP 之前。这目前在 PostgreSQL 中没有任何区别,并且已被弃用
【讨论】:
以上是关于postgresql 中的临时表在所有客户端会话中都可见吗?的主要内容,如果未能解决你的问题,请参考以下文章