对数据进行分区和排序
导出时,您可以在 SELECT 语句中使用可选的 OVER 子句来指定如何对导出的数据进行分区和/或排序。当 Vertica 查询包含输出数据的外部表时,进行分区可减小输出数据文件的大小并提高性能。(请参阅分区文件路径。)如果未指定如何对数据进行分区,Vertica 会优化导出以实现最大并行度。
要指定分区列,请在 OVER 子句中使用 PARTITION BY,如以下示例所示:
=> EXPORT TO PARQUET(directory = 'webhdfs:///data/export')
OVER(PARTITION BY date) AS SELECT transactionID, price FROM public.sales;
Rows Exported
---------------
28337
(1 row)
您既可以按某个列进行分区,也可以将该列包含在 SELECT 子句中。包含该列即可对其进行排序。Vertica 在查询执行期间仍会利用分区。
您可以对分区内的值进行排序以进一步提高性能。根据表列在查询谓词中出现的可能性对其进行排序;应先对在比较或范围谓词中最常出现的列进行排序。可以在 OVER 子句中使用 ORDER BY 对每个分区内的值进行排序:
=> EXPORT TO PARQUET(directory = 'webhdfs:///data/export')
OVER(PARTITION BY date ORDER BY price) AS SELECT date, price FROM public.sales;
Rows Exported
---------------
28337
(1 row)
即使未进行分区,也可以使用 ORDER BY。按排序顺序存储数据可以提高数据访问速度和谓词评估性能。
OVER 子句中的目标必须为列引用,不能为表达式。有关 OVER 的详细信息,请参阅 SQL 分析。
如果要将数据导出到本地文件系统,您可能需要强制要求一个节点写入所有文件。为此,请使用 OVER 空子句。