外部表与原生表有何差异

您可以像使用 Vertica 原生表一样使用外部表。但是,由于数据在数据库外部,因此外部表的操作方式存在一些差异。

数据

外部表的数据可以驻留在任何地方,前提是所有数据库节点都可以访问它。S3、HDFS 和 NFS 挂载点是查找外部数据的常见位置。与查询本地存储的 ROS 数据相比,查询外部数据自然会产生一些延迟,但 Vertica 的优化可以减少影响。例如,Vertica 可以利用 HDFS 数据的节点和机架位置。

由于数据是外部数据,因此 Vertica 会在您每次查询时加载外部数据。Vertica 经过优化以减少读取数据量,包括支持分区的格式的谓词下推和分区修剪。ORC 和 Parquet 格式支持这些优化。

由于数据是在查询时读取的,因此您必须确保您的用户拥有并保留在其原始位置读取数据的权限。根据数据的存储位置,您可能需要采取额外的步骤来管理访问权限,例如在 S3 上创建 AWS IAM 角色。

由于数据未存储在 Vertica 中,因此外部表不使用超投影和伙伴实例投影。

资源使用

外部表对 Vertica 编录的添加很少,从而减少了查询使用的资源。由于数据不存储在 Vertica 中,因此外部表不受 Tuple Mover 的影响,也不会导致 ROS 回推。在读取外部表数据时,Vertica 将使用少量内存,因为表内容不是数据库的一部分,每次使用外部表时都会进行解析。

备份和还原

由于外部表中的数据在 Vertica 以外进行管理,因此数据库备份中仅包含外部表定义(而非数据文件)。为外部表数据安排单独的备份过程。

DML 支持

外部表允许您读取外部数据。不允许您进行修改。因此,某些 DML 操作不适用于外部表,包括:

  • DELETE FROM

  • INSERT INTO

  • SELECT...FOR UPDATE

序列和标识列

外部表的 COPY 语句定义可以包含标识列和序列。每当 select 语句查询外部表时,都会重新评估序列和标识列。这会导致外部表列的值发生变化,即使基础外部表数据保持不变。