PostgreSQL Citus 扩展临时表

Slo*_*vic 5 postgresql postgresql-extensions citus

是否可以使用 PostgreSQL 中的 citus 扩展来创建复制到每个工作节点的临时表(如引用表)?

当我像这样运行 SQL 时:

DROP TABLE IF EXISTS mypoint; 
CREATE TEMP TABLE mypoint (mpoint geometry primary key); 
SELECT create_reference_table('mypoint');
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR:  unacceptable schema name "pg_temp_6"
DETAIL:  The prefix "pg_" is reserved for system schemas.
CONTEXT:  while executing command on mynode01:5432 SQL state: 42939
Run Code Online (Sandbox Code Playgroud)

我问这个问题的原因是因为之后有更多的 SQL 命令,我需要在临时表和分布式表之间进行联接(citus 扩展不允许这样做)。

Slo*_*vic 0

事实证明,从 citus 7.3 开始,无法创建引用或将临时表分发给工作节点。

有两种可能的解决方法:

  1. 修改查询以避免临时表和分布式表之间的联接(请参阅SQL 解决方法
  2. 创建临时表作为常规表,然后在填充之前将其标记为引用表

由于我需要亚秒级查询来获取用户响应,因此第一个选项对我来说效果更好。

以下是我如何修改查询的示例:

    DROP TABLE IF EXISTS myresult1;
    CREATE TEMP TABLE myresult1 AS 
    select mpoint, mgrsid, st_distance(mgrspoint, mpoint) as distance from fact_point_kpi
    inner join mypoint on st_dwithin(mgrspoint, mpoint, 0.001)
    ORDER BY mpoint, distance;

--becomes =>

    DROP TABLE IF EXISTS myresult1;
    CREATE TEMP TABLE myresult1 AS 
    SELECT mpoint, mgrsid, st_distance(mgrspoint, mpoint) AS distance
    FROM (SELECT mpoint FROM mypoint) AS mptmp
    JOIN fact_point_kpi ON st_dwithin(mgrspoint, mptmp.mpoint, 0.001)
    ORDER BY mptmp.mpoint, distance;
Run Code Online (Sandbox Code Playgroud)