使用临时表替换要约 WHERE IN

我有一个用户介绍在表中需要请求的值列表。 该列表可能非常大,并且其长度在编译期间不知道。 而不是使用
WHERE ... IN /.../

, 我认为使用临时表并连接到它会更有效率。 我在另一个问题中读了这个提议 SO /我现在找不到它,但我会在我这样做的时候编辑/.

本质在于:


CREATE TEMP TABLE my_temp_table /name varchar/160/ NOT NULL PRIMARY KEY/;

INSERT INTO my_temp_table VALUES /'hello'/;
INSERT INTO my_temp_table VALUES /'world'/;
//... etc

SELECT f.* FROM foo f INNER JOIN my_temp_table t ON f.name = t.name;

DROP TABLE my_temp_table;


如果我在同一时间有两个,如果流,我不会弄错 2 尝试创建一个表 TEMP 流动后 1?

我应该不小心为表格生成一个名字 TEMP 而不是这个?

或者,如果我在交易中徘徊所有这些,那么这个名称冲突会消失吗?

它 Postgresql 8.2.

谢!
已邀请:

知食

赞同来自:

无需担心冲突。

方案 pg_temp 这是一个具体的会话。 如果您在单独的会话中有一个并行运算符,它将使用另一个方案 /即使你看到他有同名/.

但是,两个笔记:

每次创建临时对象时,系统目录都会创建临时方案和对象本身。 这可能导致频繁使用的混乱。

因此,对于小套/频繁使用通常更好地坚持操作员
in

或者
with

/两者都有 Postgres 变化很好/. 也有时有用 "trick" 调度程序使用您正在寻找的任何计划使用不可变设置返回函数。

如果您决定使用临时表,则在您填满时通常更好地索引和分析它们。 否则,你比你写一段声明
with

.

石油百科

赞同来自:

考虑使用请求 WITH insteed:
http://www.postgresql.org/docs ... .html
它还创建一个在完成请求后被销毁的临时表。 / 交易,所以我相信并行的冲突不应该是。

要回复问题请先登录注册