这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

通过编程方式运行 Database Designer

Vertica 提供了一组元函数,支持通过编程方式访问 Database Designer 功能。通过编程方式运行 Database Designer 以执行以下任务:

  • 优化您所拥有的表的性能。

  • 无需超级用户或 DBADMIN 干预,即可创建或更新设计。

  • 添加单独的查询和表,或者向设计中添加数据,然后重新运行 Database Designer 以根据此新信息更新设计。

  • 自定义设计。

  • 使用最近执行的查询设置数据库以定期自动运行 Database Designer。

  • 为每个设计查询分配一个查询权重,用以指示该查询在创建设计时的重要性。为经常运行的查询分配更高的权重,以便 Database Designer 在创建设计时优先处理这些查询。

有关 Database Designer 函数的更多详细信息,请参阅Database Designer 函数类别

1 - Database Designer 函数类别

Database Designer 函数通常按以下顺序执行以下操作:

  1. 创建设计

  2. 设置设计属性

  3. 填充设计

  4. 创建设计和部署脚本

  5. 获取设计数据

  6. 清理

有关详细信息,请参阅 以编程方式运行 Database Designer 的工作流程。有关所需权限的信息,请参阅 运行 Database Designer 函数的权限

DESIGNER_CREATE_DESIGN 指示 Database Designer 创建设计。

设置设计属性

以下函数可让您指定设计属性:

填充设计

以下函数可用来向 Database Designer 设计中添加表和查询:

创建设计和部署脚本

以下函数将填充 Database Designer 工作区,并创建设计和部署脚本。您还可以分析统计信息,自动部署设计,以及在部署之后删除工作区:

重置设计

DESIGNER_RESET_DESIGN 会丢弃上一次 Database Designer 构建或部署的指定设计的所有运行特定信息,但会保留其配置。

获取设计数据

下列函数将显示有关 Database Designer 所创建的投影和脚本的信息:

清理

以下函数将取消任何正在运行的 Database Designer 操作或者删除 Database Designer 设计及其所有内容:

2 - 以编程方式运行 Database Designer 的工作流程

以下示例显示了通过以编程方式运行 Database Designer 来创建设计的步骤。

在运行此示例之前,您应具有 DBDUSER 角色,并且您应使用 SET ROLE DBDUSER 命令启用此角色:

  1. 在公共架构中创建一个表:

    => CREATE TABLE T(
       x INT,
       y INT,
       z INT,
       u INT,
       v INT,
       w INT PRIMARY KEY
       );
    
  2. 将数据添加到表:

    \! perl -e 'for ($i=0; $i<100000; ++$i)   {printf("%d, %d, %d, %d, %d, %d\n", $i/10000, $i/100, $i/10, $i/2, $i, $i);}'
       | vsql -c "COPY T FROM STDIN DELIMITER ',' DIRECT;"
    
  3. 在公共架构中创建第二个表:

    => CREATE TABLE T2(
       x INT,
       y INT,
       z INT,
       u INT,
       v INT,
       w INT PRIMARY KEY
       );
    
  4. T1 表中的数据复制到 T2 表,并提交更改:

    => INSERT /*+DIRECT*/ INTO T2 SELECT * FROM T;
    => COMMIT;
    
  5. 创建新设计:

    => SELECT DESIGNER_CREATE_DESIGN('my_design');
    

    此命令将信息添加到 V_MONITOR 架构中的 DESIGNS 系统表。

  6. 将公共架构中的表添加到设计:

    => SELECT DESIGNER_ADD_DESIGN_TABLES('my_design', 'public.t');
    => SELECT DESIGNER_ADD_DESIGN_TABLES('my_design', 'public.t2');
    

    这些命令将信息添加到 DESIGN_TABLES 系统表。

  7. /tmp/examples 中或在具有 READ 和 WRITE 权限的其他目录中创建一个名为 queries.txt 的文件。将以下两个查询添加到此文件,然后保存它。Database Designer 使用以下查询来创建设计:

    SELECT DISTINCT T2.u FROM T JOIN T2 ON T.z=T2.z-1 WHERE T2.u > 0;
    SELECT DISTINCT w FROM T;
    
  8. 将查询文件添加到设计,并显示结果,即已接受查询、非设计查询和不可优化查询的数量:

    => SELECT DESIGNER_ADD_DESIGN_QUERIES
         ('my_design',
         '/tmp/examples/queries.txt',
         'true'
         );
    

    结果显示接受了两个查询:

    Number of accepted queries                      =2
    Number of queries referencing non-design tables =0
    Number of unsupported queries                   =0
    Number of illegal queries                       =0
    

    DESIGNER_ADD_DESIGN_QUERIES 函数会填充 DESIGN_QUERIES 系统表。

  9. 将设计类型设置为 comprehensive。(这是默认值。)全面设计将为所有设计表创建一个初始或替换设计:

    => SELECT DESIGNER_SET_DESIGN_TYPE('my_design', 'comprehensive');
    
  10. 将优化目标设置为 query。此设置创建了一个主要用于提高查询性能的设计,它可能会推荐其他投影。这些投影会使数据库存储占用空间更大:

    => SELECT DESIGNER_SET_OPTIMIZATION_OBJECTIVE('my_design', 'query');
    
  11. 创建设计,然后将设计和部署脚本保存到 /tmp/examples 或具有 READ 和 WRITE 权限的其他目录。以下命令:

    • 会分析统计信息

    • 不会部署设计。

    • 在部署之后,不会删除设计。

    • 遇到错误时会停止。

    => SELECT DESIGNER_RUN_POPULATE_DESIGN_AND_DEPLOY
       ('my_design',
        '/tmp/examples/my_design_projections.sql',
        '/tmp/examples/my_design_deploy.sql',
        'True',
        'False',
        'False',
        'False'
        );
    

    此命令将信息添加到以下系统表:

  12. 检查已运行的 Database Designer 的状态,以查看 Database Designer 推荐了哪些投影。在 deployment_projection_name 列中:

    • rep 表示复制的投影

    • super 表示超投影

      deployment_status 列为 pending,因为设计尚未部署。

      对于此示例,Database Designer 推荐了四种投影:

      => \x
      Expanded display is on.
      => SELECT * FROM OUTPUT_DEPLOYMENT_STATUS;
      -[ RECORD 1 ]--------------+-----------------------------
      deployment_id              | 45035996273795970
      deployment_projection_id   | 1
      deployment_projection_name | T_DBD_1_rep_my_design
      deployment_status          | pending
      error_message              | N/A
      -[ RECORD 2 ]--------------+-----------------------------
      deployment_id              | 45035996273795970
      deployment_projection_id   | 2
      deployment_projection_name | T2_DBD_2_rep_my_design
      deployment_status          | pending
      error_message              | N/A
      -[ RECORD 3 ]--------------+-----------------------------
      deployment_id              | 45035996273795970
      deployment_projection_id   | 3
      deployment_projection_name | T_super
      deployment_status          | pending
      error_message              | N/A
      -[ RECORD 4 ]--------------+-----------------------------
      deployment_id              | 45035996273795970
      deployment_projection_id   | 4
      deployment_projection_name | T2_super
      deployment_status          | pending
      error_message              | N/A
      
  13. 查看 /tmp/examples/my_design_deploy.sql 脚本,以了解在运行部署脚本时如何创建投影。在此示例中,脚本也会向列分配编码方案 RLE 和 COMMONDELTA_COMP(如合适)。

  14. 从保存设计的目录中部署设计。

    => \i /tmp/examples/my_design_deploy.sql
    
  15. 现在,设计已部署,可以删除设计:

    => SELECT DESIGNER_DROP_DESIGN('my_design');
    

3 - 运行 Database Designer 函数的权限

具有 DBDUSER 角色 的非 DBADMIN 用户可以运行 Database Designer 函数。使用户能够运行这些函数需要两个步骤:

  1. DBADMIN 或超级用户授予用户 DBDUSER 角色:

    => GRANT DBDUSER TO username;
    

    在 DBADMIN 撤销此角色之前,此角色一直存在。

  2. 在 DBDUSER 能够运行 Database Designer 函数之前,必须出现以下情况之一:

    • 该用户启用 DBDUSER 角色:

      => SET ROLE DBDUSER;
      
    • 超级用户将用户的默认角色设置为 DBDUSER:

      => ALTER USER username DEFAULT ROLE DBDUSER;
      

DBDUSER 常规限制

对于 DBDUSER,以下限制适用:

  • 您可以将设计的 K-safety 设置为小于或等于系统 K-safety 的值。您无法更改系统 K-safety。

  • 您不能显式更改 Ancient History Mark (AHM),即便在设计部署期间同样如此。

设计依赖项和权限

单个设计任务可能具有需要特定权限的依赖项:

4 - Database Designer 用户的资源池

当您授予用户 DBDUSER 角色时,请确保将资源池与该用户相关联以在 Database Designer 运行期间管理资源。这允许多个用户可以同时运行 Database Designer,他们互相之间不会出现干扰,也不会用尽群集的所有资源。