我已经让用户在表中输入需要查询的值列表。该列表可能非常大,并且在编译时长度未知。而不是使用WHERE ... IN (...)我在想的是,使用临时表并对其执行联接会更有效。我在另一个SO问题中阅读了此建议(目前无法找到,但在编辑时会进行编辑)。
WHERE ... IN (...)
要点是这样的:
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尝试在线程1之后创建TEMP表,我不会收到错误消息吗?
我应该为TEMP表随机生成一个名称吗?
或者,如果我将整个内容包装在交易中,命名冲突会消失吗?
这是Postgresql 8.2。
谢谢!
无需担心冲突。
pg_temp模式是特定于会话的。如果在一个单独的会话中有一个并发语句,它将使用不同的模式(即使您看到它具有相同的名称)。
但是,有两个注意事项:
因此,对于小批量/频繁使用的情况,通常最好坚持使用in或with声明(Postgres都可以很好地应对)。通过使用不可变的集合返回函数,“诱骗”计划者使用您正在寻找的任何计划有时也很有用。
in
with