数据收集器表查询

Vertica 数据收集器可收集和保留有关数据库群集的信息,从而扩展了系统表功能。数据收集器会在系统表中提供这些信息。

Vertica Analytic Database 会将数据收集数据存储在 Vertica 或编录路径下的数据收集器目录中。使用数据收集器信息可以查询系统表的过去状态并提取聚合信息。

一般来说,如果数据收集器表只有包含所需数据的列,查询这些表的效率会更高。在以下情况下,查询也会更加高效:

避免重新分段

session_idtransaction_id 上联接以下 DC 表时,您可以避免重新分段,因为所有数据都是本地数据:

  • dc_session_starts

  • dc_session_ends

  • dc_requests_issued

  • dc_requests_completed

查询包括 node_name 列时,不需要重新分段。例如:

=> SELECT dri.transaction_id, dri.request, drc.processed_row_count
    FROM dc_requests_issued dri
    JOIN dc_requests_completed drc
    USING (node_name, session_id, request_id)     WHERE dri.time between 'April 7,2015'::timestamptz and 'April 8,2015'::timestamptz
    AND drc.time between 'April 7,2015'::timestamptz and 'April 8,2015'::timestamptz;

此查询会高效运行,因为:

  • 启动程序节点仅写入到 dc_requests_issued dc_requests_completed

  • session_idnode_name 彼此相关。

使用时间谓词

为时间范围谓词使用非易变函数以及 TIMESTAMP。Vertica Analytic Database 会优化使用时间谓词的 DC 表的 SQL 性能。

每个 DC 表都有一个 time 列。使用此列可将时间范围作为查询谓词输入。

例如,此查询会返回日期在 9 月 1 日到 9 月 10 日之间的数据: select * from dc_foo where time > 'Sept 1, 2015::timestamptz and time < 'Sept 10 2015':: timestamptz; 您可以更改最小或最大时间值,调整要检索数据的时间范围。

您必须将非可变函数用作时间谓词。 可变函数 导致查询运行效率低下。此示例返回了在 2015 年 4 月 7 日开始和结束的所有查询。但是,查询并未以最佳性能运行,因为 trunctimestamp 是可变的:

=> SELECT dri.transaction_id, dri.request, drc.processed_row_count
    FROM dc_requests_issued dri
    LEFT JOIN dc_requests_completed drc
    USING (session_id, request_id)
    WHERE trunc(dri.time, ‘DDD’) > 'April 7,2015'::timestamp
    AND trunc(drc.time, ‘DDD’) < 'April 8,2015'::timestamp;