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

返回本页常规视图.

分析查询计划

要通过查询计划及其各个 路径监控实时数据流,请查询以下系统表:

执行_引擎_配置文件QUERY_PLAN_PROFILES。这些表提供了有关 Vertica 如何执行查询计划及其各个 路径的数据:

每个查询计划路径都具有唯一的 ID,如以下 EXPLAIN 输出片段中所示。

每个表都提供特定于路径的数据。例如,QUERY_PLAN_PROFILES 为每个路径提供高级别数据,包括:

  • 查询操作执行时长

  • 路径操作所用的内存大小

  • 通过网络发送/接收的数据大小

例如,您可能观察到 GROUP BY HASH 操作的执行时间为 0.2 秒,使用的内存为 100MB。

要求

实时分析至少需要待监控事务的 ID。如果事务包括多个语句,则还需要语句 ID。可以通过对要分析的查询发出 PROFILE 来获取语句和事务 ID。随后可使用这些标识符来查询系统表 EXECUTION_ENGINE_PROFILESQUERY_PLAN_PROFILES

有关详细信息,请参阅分析单个语句

1 - 获取小型查询的查询计划状态

存储在 执行_引擎_配置文件 系统表中的实时分析计数器可用于当前执行的所有语句,包括 合并等内部操作。

如果满足以下任一条件,则可以在查询执行完成后使用分析计数器:

  • 查询是通过 PROFILE 命令运行的

  • Vertica 元函数 ENABLE_PROFILING 启用了系统范围的分析。

  • 查询运行了两秒以上。

分析计数器保存在 EXECUTION_ENGINE_PROFILES 系统表中,直至超出存储配额。

例如:

  1. 分析查询以从 EXECUTION_ENGINE_PROFILES 获取 transaction_idstatement_id。例如:

    => PROFILE SELECT * FROM t1 JOIN t2 ON t1.x = t2.y;
    NOTICE 4788:  Statement is being profiled
    HINT:  Select * from v_monitor.execution_engine_profiles where transaction_id=45035996273955065 and statement_id=4;
    NOTICE 3557:  Initiator memory for query: [on pool general: 248544 KB, minimum: 248544 KB]
    NOTICE 5077:  Total memory required by query: [248544 KB]
     x | y |   z
    ---+---+-------
     3 | 3 | three
    (1 row)
    
  2. 查询系统表 QUERY_PLAN_PROFILES

    => SELECT ... FROM query_plan_profiles
         WHERE transaction_id=45035996273955065 and statement_id=4;
         ORDER BY transaction_id, statement_id, path_id, path_line_index;
    

2 - 获取大型查询的查询计划状态

实时分析用于监控大型(长时间运行的)查询。请按照以下步骤监控大型查询的计划:

  1. 通过查询系统表 CURRENT_SESSION 获取要分析的查询计划的语句和事务 ID:

    => SELECT transaction_id, statement_id from current_session;
      transaction_id   | statement_id
    -------------------+--------------
     45035996273955001 |            4
    (1 row)
    
  2. 运行查询:

    => SELECT * FROM t1 JOIN t2 ON x=y JOIN ext on y=z;
    
  3. 查询系统表 QUERY_PLAN_PROFILES,并对 transaction_id、statement_id、path_id 和 path_line_index 列进行排序。

    => SELECT ... FROM query_plan_profiles WHERE transaction_id=45035996273955001 and statement_id=4
       ORDER BY transaction_id, statement_id, path_id, path_line_index;
    

也可以使用 Linux watch 命令监控长时间运行的查询(请参阅实时分析)。

示例

以下一系列命令会为长时间运行的查询创建表,然后查询系统表 QUERY_PLAN_PROFILES

  1. 创建名为 longq 的表:

    => CREATE TABLE longq(x int);
    CREATE TABLE
    => COPY longq FROM STDIN;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 1
    >> 2
    >> 3
    >> 4
    >> 5
    >> 6
    >> 7
    >> 8
    >> 9
    >> 10
    >> \.
    => INSERT INTO longq SELECT f1.x+f2.x+f3.x+f4.x+f5.x+f6.x+f7.x
          FROM longq f1
          CROSS JOIN longq f2
          CROSS JOIN longq f3
          CROSS JOIN longq f4
          CROSS JOIN longq f5
          CROSS JOIN longq f6
          CROSS JOIN longq f7;
      OUTPUT
    ----------
     10000000
    (1 row)
    => COMMIT;
    COMMIT
    
  2. 通过使用 vsql \o 命令禁止查询在终端窗口上输出:

    => \o /home/dbadmin/longQprof
    
  3. 查询新表:

    => SELECT * FROM longq;
    
  4. 获取事务和语句 ID:

    => SELECT transaction_id, statement_id from current_session;
      transaction_id   | statement_id
    -------------------+--------------
     45035996273955021 |            4
    (1 row)
    
  5. 关闭 \o 命令以便 Vertica 继续将查询计划信息保存到您已指定的文件。或者,使其保持打开状态并在查询系统表 QUERY_PLAN_PROFILES 后检查该文件。

    => \o
    
  6. 查询系统表 QUERY_PLAN_PROFILES

    => SELECT
         transaction_id,
         statement_id,
         path_id,
         path_line_index,
         is_executing,
         running_time,
         path_line
       FROM query_plan_profiles
       WHERE transaction_id=45035996273955021 AND statement_id=4
       ORDER BY transaction_id, statement_id, path_id, path_line_index;
    

3 - 改善 QUERY_PLAN_PROFILES 输出的可读性

QUERY_PLAN_PROFILES 表的输出会因 path_line 列而非常宽。为提高可读性,使用下面的一个或多个选项查询 QUERY_PLAN_PROFILES

  • transaction_idstatement_idpath_idpath_line_index 对输出排序:

    => SELECT ... FROM query_plan_profiles
         WHERE ...
        ORDER BY transaction_id, statement_id, path_id, path_line_index;
    
  • 使用列别名减小列宽:

    => SELECT statement_id AS sid, path_id AS id, path_line_index AS order,
         is_started AS start, is_completed AS end, is_executing AS exe,
         running_time AS run, memory_allocated_bytes AS mem,
         read_from_disk_bytes AS read, received_bytes AS rec,
         sent_bytes AS sent, FROM query_plan_profiles
         WHERE transaction_id=45035996273910558 AND statement_id=3
         ORDER BY transaction_id, statement_id, path_id, path_line_index;
    
  • 使用 vsql \o 命令将 EXPLAIN 输出重定向至文件:

    => \o /home/dbadmin/long-queries
    => EXPLAIN SELECT * FROM customer_dimension;
    => \o
    

4 - 管理查询分析数据

Vertica 会一直保留查询数据,直至超出表的存储配额,此时它会自动清除最旧的查询,以便为新查询腾出空间。还可以通过调用以下函数之一来清除已分析的数据:

  • CLEAR_PROFILING 会从内存中清除已分析的数据。例如,下列命令清除常规查询运行信息的分析,如已用的查询字符串和查询持续时间。

    => SELECT CLEAR_PROFILING('query');
    
  • CLEAR_DATA_COLLECTOR 会清除与数据收集器表和函数相关的所有内存及磁盘记录,并重置 DATA_COLLECTOR 系统表中的收集统计信息。

  • FLUSH_DATA_COLLECTOR 会一直等到内存日志移动到磁盘,然后刷新数据收集器,使 DataCollector 日志与磁盘存储同步。

配置数据保留策略

Vertica 按照配置的保留策略的规定保留它收集的历史数据

5 - 分析次优查询计划

如果分析未涵盖不理想的查询,调用下列函数之一可能有所帮助:

  • ANALYZE_WORKLOAD 分析系统表中保存的系统信息,并根据统计信息、系统和 数据收集器事件以及数据库-表-投影设计的组合提供优化建议。

  • ANALYZE_STATISTICS 从存储与指定表或列相关联的投影的所有节点中收集并聚合数据示例和存储信息。

您还可以通过 Database Designer 运行查询。请参阅增量设计