Using a temporary table to replace a WHERE IN clause

戏子无情 提交于 2019-12-08 03:47:38

问题


I've got the user entering a list of values that I need to query for in a table. The list could be potentially very large, and the length isn't known at compile time. Rather than using WHERE ... IN (...) I was thinking it would be more efficient to use a temporary table and execute a join against it. I read this suggestion in another SO question (can't find it at the moment, but will edit when I do).

The gist is something like:

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;

If I have two of these going at the same time, would I not get an error if Thread 2 tries to create the TEMP table after Thread 1?

Should I randomly generate a name for the TEMP table instead?

Or, if I wrap the whole thing in a transaction, will the naming conflict go away?

This is Postgresql 8.2.

Thanks!


回答1:


There is no need to worry about the conflict.

The pg_temp schema is session specific. If you've a concurrent statement in a separate session, it'll use a different schema (even if you see it as having the same name).

Two notes, however:

  1. Every time you create temporary objects, the system catalog creates a temporary schema and the objects themselves. This can lead to clutter if used frequently.

    Thus, for small sets/frequent uses, it's usually better stick to an in or a with statement (both of which Postgres copes quite well with). It's also occasionally useful to "trick" the planner into using whichever plan you're seeking by using an immutable set returning function.

  2. In the event you decide to actually use temporary tables, it's usually better to index and analyze them once you've filled them up. Else you're doing little more than writing a with statement.




回答2:


Consider using WITH query insteed: http://www.postgresql.org/docs/9.0/interactive/queries-with.html

It also creates temporary table, which is destroyed when query / transaction finishes, so I believe there should be no concurrency conflicts.



来源:https://stackoverflow.com/questions/5981388/using-a-temporary-table-to-replace-a-where-in-clause

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!