当前位置: 首页 > 面试题库 >

临时表的Postgresql线程安全

嵇永望
2023-03-14
问题内容

我用于创建临时表的语法如下:

create temp table tmpTable (id bigint not null, primary key (id)) on commit drop;

我知道这意味着在每笔交易结束时,都会删除该表。我的问题是,如果同一会话上的两个或多个线程创建并将值插入到临时表中,它们将各自获取自己的实例,还是该临时实例在整个会话中共享?如果它是共享的,是否有一种方法可以使每个线程本地化?

感谢Netta


问题答案:

临时表对于同一会话中的所有操作都是可见的。因此,在删除存在的临时表之前(在您的情况下提交事务),您 无法 在同一会话中 创建同名的临时表。

您可能要使用:

CREATE TEMP TABLE tmptbl IF NOT EXISTS ...

有关CREATE TABLE手册的更多信息。

唯一的临时表

为了使临时表在每个“线程”中处于本地(在同一会话中),您需要使用 唯一的表名 。一种方法是使用无限制的SEQUENCE动态SQL-
以过程语言(如plpgsql)或DO语句(基本上相同,但不存储函数)使用。

运行一:

CREATE SEQUENCE myseq;

用:

DO $$
BEGIN
EXECUTE 'CREATE TABLE tmp' || nextval('myseq')  ||'(id int)';
END;
$$

要知道最新的表名:

SELECT 'tmp' || currval('myseq');

或者将它们全部放入plpgsql函数中并返回表或重用表名。

但是,由于普通的SQL语句使用硬编码的标识符运行,因此所有其他SQL命令都必须动态执行。因此,最好将它们全部放入plpgsql函数中。

使用相同临时表的唯一ID

另一种可能的解决方案是对同一会话中的所有线程使用 相同的临时表thread_id
并向该表中添加一列。如果您大量使用此功能,请确保为该列编制索引。然后在thread_id每个线程中使用唯一的线程(在同一会话中)。

只有一次:

CREATE SEQUENCE myseq;

每个线程一次:

CREATE TEMP TABLE tmptbl(thread_id int, col1 int) IF NOT EXISTS;
my_id :=  nextval('myseq'); -- in plpgsql
-- else find another way to assign unique id per thread

SQL:

INSERT INTO tmptbl(thread_id, col1) VALUES
(my_id, 2), (my_id, 3), (my_id, 4);

SELECT * FROM tmptbl WHERE thread_id = my_id;


 类似资料:
  • 问题内容: 如何在PostgreSQL中使用select into创建临时表。例如在SQL中 问题答案: 您可以尝试使用“将 表另存为” 命令,如下所示: 从文档中: 该命令在功能上类似于SELECT INTO ,但是它是首选的,因为它不太可能与SELECT INTO语法的其他用法混淆。此外,CREATE TABLE AS提供了SELECT INTO提供的功能的超集。 CREATE TABLE A

  • 我有一个关于在Java中如何工作的基本问题。 很难看出简单创建并行执行某些任务和将每个任务分配给之间的区别。 看起来使用起来也非常简单和高效,所以我想知道为什么我们不一直使用它。 这只是一种方式比另一种方式执行工作更快的问题吗? 这里有两个非常简单的例子来说明这两种方式之间的区别: 使用executor服务:计数器(任务) 使用executor服务:(创建、提交)

  • 主要内容:示例,删除临时表关系型数据库支持临时表,这是一项很棒的功能。临时表的概念由 SQL Server 引入,用来存储和处理中间结果。 临时表在会话期间创建,会话结束后自动被删除。临时表可以和普通表一样执行各种操作,比如 SELECT、UPDATE、INSERT、JOIN 等。 MySQL 3.23 及其更高版本才支持临时表,如果您使用的 MySQL 版本低于 3.23,则不能使用临时表,但可以使用堆表(Heap Ta

  • 问题内容: 数百万条记录的哪个更快:永久表 还是 临时表? 我只需要将其用于1500万条记录。处理完成后,我们将删除这些记录。 问题答案: 在您的情况下,我们使用称为临时表的永久表。这是大量进口的常用方法。实际上,我们通常使用两个登台表,一个带有原始数据,另一个带有清理后的数据,这使得研究提要中的问题变得更加容易(它们几乎总是我们客户发现向我们发送垃圾数​​据的新方式和多种方式的结果,但是我们必须

  • 本文向大家介绍对比Oracle临时表和SQL Server临时表的不同点,包括了对比Oracle临时表和SQL Server临时表的不同点的使用技巧和注意事项,需要的朋友参考一下 Oracle数据库创建临时表的过程以及和SQL Server临时表的不同点的对比的相关知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧,希望能够对您有所帮助。 1.简介 Oracle数据库除了可以

  • 问题内容: 我注意到,通常建议使用具有多个线程的队列,而不是列表和。这是因为列表不是线程安全的,还是出于其他原因? 问题答案: 列表本身是线程安全的。在CPython中,GIL防止对它们的并发访问,而其他实现则请小心地为它们的列表实现使用细粒度锁或同步数据类型。但是,虽然列表本身不会因尝试并发访问而损坏,但列表的数据不受保护。例如: 如果另一个线程做同样的事情,则不能保证实际上将增加1,因为这不是