2

假设我在 psql 上运行以下查询:

> select a.c1, b.c2 into temp_table from db.A as a inner join db.B as b 
> on a.x = b.x limit 10;

我收到以下消息:

注意:表没有“DISTRIBUTED BY”子句——使用名为“c1”的列作为该表的Greenplum数据库数据分布键。
提示:“DISTRIBUTED BY”子句确定数据的分布。确保选择的列是最佳数据分布键,以最大限度地减少偏差。

  1. 什么是DISTRIBUTED BY列?
  2. 存储在哪里temp_table?它是存储在我的客户端还是服务器上?
4

3 回答 3

4
  1. DISTRIBUTED BY 是 Greenplum 如何确定哪个段将存储每一行​​。因为 Greenplum 是大多数生产数据库中的 MPP 数据库,所以您将拥有多个分段服务器。您要确保 Distribution 列是您将在 usaly 上加入的列。

  2. temp_table 是将在 Greenplum 集群上为您创建的表。如果您没有将 search_path 设置为其他内容,它将位于公共模式中。

于 2014-02-07T20:58:40.777 回答
1

对于您的第一个问题,该DISTRIBUTE BY子句用于告诉数据库服务器如何将数据库存储在磁盘上。(创建表文档

我确实立即看到一件事,您所说的 Join 子句中的语法可能有问题on a.x = s.x--> 没有引用为 s 的表。也许您的问题就像将其更改为一样简单on a.x = b.x

至于临时表存放在哪里,相信一般都存放在数据库服务器上。这对于您的 DBA 来说是一个问题,因为它是安装数据库时的一个设置项。如果您想保存结果(不打印),您可以随时将数据转储到计算机上的文件中并在以后重新加载。

于 2014-02-07T20:47:05.350 回答
0

据我所知, tmp 表存储在内存中。数据少的时候比较快,推荐使用临时表。相反,由于临时表存储在内存中,如果数据过多,则会消耗非常大的内存。建议使用带分布式子句的常规表。因为它将分布在您的集群中。

另外,tmp表存储在一个特殊的schema中,所以创建temp表时不需要指定schema名,它只存在于当前连接中,关闭当前连接后,postgresql会删除该表自动地。

于 2015-12-29T18:16:39.627 回答