采样子句

    启用数据采样时,不会对所有数据执行查询,而只对特定部分数据(样本)执行查询。 例如,如果您需要计算所有访问的统计信息,只需对所有访问的1/10分数执行查询,然后将结果乘以10即可。

    近似查询处理在以下情况下可能很有用:

    • 当你有严格的时间需求(如\<100ms),但你不能通过额外的硬件资源来满足他们的成本。
    • 业务需求的目标是近似结果(为了成本效益,或者向高级用户推销确切结果)。

    您只能使用采样中的表 MergeTree 族,并且只有在表创建过程中指定了采样表达式(请参阅 ).

    下面列出了数据采样的功能:

    • 数据采样是一种确定性机制。 同样的结果 SELECT .. SAMPLE 查询始终是相同的。
    • 对于不同的表,采样工作始终如一。 对于具有单个采样键的表,具有相同系数的采样总是选择相同的可能数据子集。 例如,用户Id的示例采用来自不同表的所有可能的用户Id的相同子集的行。 这意味着您可以在子查询中使用采样 IN 此外,您可以使用 。
    • 采样允许从磁盘读取更少的数据。 请注意,您必须正确指定采样键。 有关详细信息,请参阅 创建MergeTree表.

    SAMPLE 子句支持以下语法:

    查询执行于 k 数据的分数。 例如, SAMPLE 0.1 对10%的数据运行查询。 SAMPLE n 这里 n 是足够大的整数。该查询是在至少一个样本上执行的 n 行(但不超过这个)。 例如, SAMPLE 10000000 在至少10,000,000行上运行查询。 Read more SAMPLE k OFFSET m 这里 k 和 是从0到1的数字。查询在以下示例上执行 k 数据的分数。 用于采样的数据由以下偏移 m 分数。

    在一个 SAMPLE k 子句,样品是从 k 数据的分数。 示例如下所示:

    在此示例中,对0.1(10%)数据的样本执行查询。 聚合函数的值不会自动修正,因此要获得近似结果,值 count() 手动乘以10。

    这里 n 是足够大的整数。 例如, SAMPLE 10000000.

    在这种情况下,查询在至少一个样本上执行 n 行(但不超过这个)。 例如, SAMPLE 10000000 在至少10,000,000行上运行查询。

    由于数据读取的最小单位是一个颗粒(其大小由 index_granularity 设置),是有意义的设置一个样品,其大小远大于颗粒。

    使用时 子句,你不知道处理了哪些数据的相对百分比。 所以你不知道聚合函数应该乘以的系数。 使用 _sample_factor 虚拟列得到近似结果。

    _sample_factor 列包含动态计算的相对系数。 当您执行以下操作时,将自动创建此列 创建 具有指定采样键的表。 的使用示例 _sample_factor 列如下所示。

    1. FROM visits
    2. SAMPLE 10000000

    下一个示例演示如何计算访问总数:

    下面的示例显示了如何计算平均会话持续时间。 请注意,您不需要使用相对系数来计算平均值。

    1. SELECT avg(Duration)
    2. FROM visits

    这里 km 是从0到1的数字。 示例如下所示。

    示例1

    在此示例中,示例是所有数据的十分之一:

    [++------------]

    示例2

    [------++------]