用于处理本地数据的分区选项

UDTF 通常以特定方式处理已分区的数据。例如,处理 Web 服务器日志文件以计算每个合作伙伴网站引用的点击数的 UDTF 需要具有按引用网站列分区的输入。UDTF 的每个实例将查看特定合作伙伴站点引用的点击,以便计算其数量。

在与此类似的情况下,窗口分区子句应使用 PARTITION BY 子句。群集中的每个节点将对其存储的数据进行分区并将部分分区发送给其他节点,然后合并从其他节点收到的分区并运行 UDTF 的一个实例以处理这些分区。

在其他情况下,UDTF 可能不需要以特殊方式对输入数据进行分区,例如,从 Apache 日志文件解析数据的 UDTF。在这种情况下,您可以指定每个 UDTF 实例仅处理由节点(该实例正在此节点上运行)存储在本地的数据。通过消除对数据进行分区的开销,可以大大提高处理效率。

可以使用以下窗口分区选项之一来指示 UDTF 仅处理本地数据:

  • PARTITION BEST:仅对于线程安全的 UDTF,可通过多个节点间的多线程查询来优化性能。

  • PARTITION NODES:优化多个节点间的单线程查询的性能。

查询必须指定将在所有节点之间复制且包含一行的源表(类似于 DUAL 表)。例如,以下语句将调用可解析存储在本地的 Apache 日志文件的 UDTF:

=> CREATE TABLE rep (dummy INTEGER) UNSEGMENTED ALL NODES;
CREATE TABLE
=> INSERT INTO rep VALUES (1);
 OUTPUT
--------
      1
(1 row)
=> SELECT ParseLogFile('/data/apache/log*') OVER (PARTITION BEST) FROM rep;