gpt4 book ai didi

sql - 使用临时表替换 WHERE IN 子句

转载 作者:行者123 更新时间:2023-11-29 11:57:44 26 4
gpt4 key购买 nike

我让用户输入了我需要在表中查询的值列表。该列表可能非常大,并且在编译时不知道长度。而不是使用 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 尝试在线程 1 之后创建 TEMP 表,我不会收到错误消息吗?

我是否应该为 TEMP 表随机生成一个名称?

或者,如果我将整个事情包装在一个事务中,命名冲突会消失吗?

这是 Postgresql 8.2。

谢谢!

最佳答案

无需担心冲突。

pg_temp 模式是特定于 session 的。如果您在单独的 session 中有一个并发语句,它将使用不同的架构(即使您认为它具有相同的名称)。

但是有两个注意事项:

  1. 每次您创建临时对象时,系统目录都会创建一个临时架构和对象本身。如果经常使用,这可能会导致困惑。

    因此,对于小集合/频繁使用,通常最好坚持 inwith 语句(Postgres 都能很好地应对)。通过使用不可变的集合返回函数,“欺骗”计划者使用您正在寻找的任何计划偶尔也很有用。

  2. 如果您决定实际使用临时表,通常最好在填满临时表后对其进行索引和分析。否则,您所做的不过是编写一条 with 语句。

关于sql - 使用临时表替换 WHERE IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com