count() 是否产生它需要计数的基础 table?

Does count() produces the underlying table it needs to count?

我老板要我对三个table进行join,姑且称它们为tableAtableBtableC,分别有74M、3M和7500 万行。

如果有用,查询如下所示:

SELECT A.*, 
   C."needed_field"
FROM "tableA" A
INNER JOIN (SELECT "field_join_AB", "field_join_BC" FROM "tableB") B
    ON A."field_join_AB" = B."field_join_AB"
INNER JOIN (SELECT "field_join_BC", "needed_field" FROM "tableC") C
    ON B."field_join_BC" = C."field_join_BC"

Dataiku Data Science Studio + Vertica 上尝试查询时,它似乎创建了临时数据来生成输出,它填满了服务器上 space 的 1T,使其膨胀.

我老板对SQL了解不多,所以他不明白在最坏的情况下,它可以产生一个table 74M*3M*75M = 1.6* 10^19 行,可能是这里的问题(我是全新的,我还不知道数据,所以我不知道查询是否可能产生那么多行)。

因此我想知道我是否有办法事先知道将生成多少行:如果我做了 COUNT(),例如:

SELECT COUNT(*)
FROM "tableA" A
INNER JOIN (SELECT "field_join_AB", "field_join_BC" FROM "tableB") B
    ON A."field_join_AB" = B."field_join_AB"
INNER JOIN (SELECT "field_join_BC", "needed_field" FROM "tableC") C
    ON B."field_join_BC" = C."field_join_BC"

底层引擎是否生成整个数据集,然后对其进行计数? (这意味着我不能事先计算,至少不是那样)。

或者 COUNT() 有没有可能给我一个结果? (因为它不是构建数据集而是以其他方式计算)

(注意:我目前正在测试它,但现在计数已经 运行 3500 万)

Vertica 是一个列式数据库。您执行的任何查询只需要查看解析输出、连接、谓词等所需的列。

在许多情况下,Vertica 还能够查询编码数据,避免在实际需要之前完全实现。

这样的计数在 Vertica 中可以非常快。您真的不需要跳过这些步骤,Vertica 将只包含实际使用的列。优化器不会尝试重构整行,只会重构它需要的列。

这里可能发生的情况是您对转播进行了散列连接。如果您的基础预测不一致并且您的排序不同并且您将多个大表连接在一起,那么连接本身可能很昂贵,因为它必须将它全部加载到哈希中并进行大量数据的网络重新广播以获得加入发生在发起者节点上。

我会考虑 运行ning DBD 使用这些查询作为输入,特别是如果这些是常见的查询模式。如果您还没有 运行 DBD 并且没有使用自定义投影,那么您的默认投影可能不会执行良好并导致我上面提到的情况。

你可以解释一下,看看是怎么回事。