自动投影

自动投影是 Vertica 为临时表和持久表自动生成的 超投影。通常,如果没有为表定义任何投影,Vertica 会在您首次将数据加载到该表时自动为该表创建投影。以下规则适用于所有自动投影:

  • Vertica 在与表相同的架构中创建自动投影。

  • 自动投影符合表的创建语句中指定的编码、排序顺序、分段和 K-safety。

  • 如果表的创建语句包含 AS SELECT 子句,则 Vertica 使用投影定义的基础查询的某些属性。

自动投影触发器

创建自动投影的条件会依据表是临时表还是持久表而有所不同:

默认分段和排序顺序

如果 CREATE TABLECREATE TEMPORARY TABLE 省略分段(SEGMENTED BYUNSEGMENTED)或者 ORDER BY 子句,则 Vertica 按如下方式对自动投影进行分段和排序:

  1. 如果表的创建语句省略分段(SEGMENTED BYUNSEGMENTED)子句,则 Vertica 检查配置参数 SegmentAutoProjection 以确定是创建分段的自动投影还是未分段的自动投影。默认情况下,此参数设置为 1(启用)。

  2. 如果启用了 SegmentAutoProjection,并且表的创建语句也省略 ORDER BY 子句,则 Vertica 会根据表的创建方式对表的自动投影进行分段和排序:

    • 如果 CREATE [TEMPORARY] TABLE 包含 AS SELECT 子句且查询输出已分段,则自动投影将使用同一分段。如果结果集已排序,则投影将使用相同的排列顺序。

    • 在所有其他情况下,Vertica 会对表列约束求值,以确定如何对投影排序和分段,如下所示:

例如,下表是在没有主键或外键的情况下定义的:

=> CREATE TABLE testAutoProj(c10 char (10), v1 varchar(140) DEFAULT v2||v3, i int, c5 char(5), v3 varchar (80), d timestamp, v2 varchar(60), c1 char(1));
CREATE TABLE
=> INSERT INTO testAutoProj VALUES
   ('1234567890',
   DEFAULT,
   1,
   'abcde',
   'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor ',
   current_timestamp,
   'incididunt ut labore et dolore magna aliqua. Eu scelerisque',
   'a');
 OUTPUT
--------
      1
(1 row)
=> COMMIT;
COMMIT

在 INSERT 语句首次将数据加载到该表之前,Vertica 自动为该表创建一个超投影:

=> SELECT export_objects('', 'testAutoProj_b0');
--------------------------------------------------------

CREATE PROJECTION public.testAutoProj_b0 /*+basename(testAutoProj),createtype(L)*/
( c10, v1, i, c5, v3, d, v2, c1 )
AS
 SELECT testAutoProj.c10,
        testAutoProj.v1,
        testAutoProj.i,
        testAutoProj.c5,
        testAutoProj.v3,
        testAutoProj.d,
        testAutoProj.v2,
        testAutoProj.c1
 FROM public.testAutoProj
 ORDER BY testAutoProj.c10,
          testAutoProj.v1,
          testAutoProj.i,
          testAutoProj.c5,
          testAutoProj.v3,
          testAutoProj.d,
          testAutoProj.v2,
          testAutoProj.c1
SEGMENTED BY hash(testAutoProj.i, testAutoProj.c5, testAutoProj.d, testAutoProj.c1, testAutoProj.c10, testAutoProj.v2, testAutoProj.v3, testAutoProj.v1) ALL NODES OFFSET 0;

SELECT MARK_DESIGN_KSAFE(1);

(1 row)