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

使用临时表替换WHERE IN子句

容磊
2023-03-14
问题内容

我已经让用户在表中输入需要查询的值列表。该列表可能非常大,并且在编译时长度未知。而不是使用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模式是特定于会话的。如果在一个单独的会话中有一个并发语句,它将使用不同的模式(即使您看到它具有相同的名称)。

但是,有两个注意事项:

  1. 每次创建临时对象时,系统目录都会创建一个临时模式和对象本身。如果经常使用,可能会导致混乱。

因此,对于小批量/频繁使用的情况,通常最好坚持使用inwith声明(Postgres都可以很好地应对)。通过使用不可变的集合返回函数,“诱骗”计划者使用您正在寻找的任何计划有时也很有用。

  1. 如果您决定实际使用临时表,通常最好在填充临时表后对其进行索引和分析。否则,您要做的只是写with声明。


 类似资料:
  • 操作步骤: 菜单栏: Refactor —> Replace Temp with Query...

  • 我有一个类似的数据集 我的星火密码是 我试图通过调用createOrReplaceTempView来替换people视图 但我得到如下错误 如何替换spark中的视图?

  • 问题内容: 我想用另一个子列表替换list中的一个子列表。像这样: 可以说我想要一个像这样的子列表: 并替换为 所以最终结果将是 有什么建议? 问题答案: 希望能有所帮助

  • 本文向大家介绍sql的临时表使用小结,包括了sql的临时表使用小结的使用技巧和注意事项,需要的朋友参考一下 1、创建方法: 方法一: create table TempTableName 或 select [字段1,字段2,...,] into TempTableName from table 方法二: create table tempdb.MyTempTable(Tid int) 说明: (1

  • 问题内容: 这是一个悬而未决的问题,但我真的很想听听人们的意见。 我很少使用显式声明的临时表(表变量或常规#tmp表),因为我认为不这样做会导致更简洁,可读性和可调试性的T- SQL。我还认为,与需要临时存储(例如,在查询中使用派生表)时使用SQL相比,SQL可以做得更好。 唯一的例外是当数据库不是典型的关系数据库而是星型或雪花模式时。我了解最好是首先将过滤器应用于事实表,然后使用生成的临时表从维

  • 问题内容: 为什么不能在where子句中使用临时列? 例如,此查询: 这将显示两列,一列称为,另一列称为。是即时创建的,始终为1或0,具体取决于是否有50个或该品牌的产品。 这一切对我来说都是有意义的,除了我不能仅在以下查询中选择时: 这给了我这个错误: 问题答案: 使用来代替: 被评估 前 的。被评估之后。