雪花中的COUNT(*)与COUNT(列)性能

时间:2020-07-15 19:45:32

标签: snowflake-cloud-data-platform

由于SnowFlake是列式数据库,因此当您使用COUNT(*)vs COUNT(列)时,是否会影响性能?这是假设您要引用的列没有任何NULL

2 个答案:

答案 0 :(得分:1)

count(column)具有理论上的开销,即数据库需要检查每一行的值确实不是NULL,而对于count(*)则永远不需要。

使用count(*),数据库还可以自由选择任何索引以加快计数速度,而使用count(column),则强制强制遍历所有值,而不用例如主键索引。

一个好的优化程序可能会使两个版本都做同样的事情(假设存在NOT NULL约束),但是count(*)留下了更多的可能性。

答案 1 :(得分:1)

正如a_horse_with_no_name所解释的,这两个函数是不同的,但是您已经提到该列没有NULL值。因此,在您的情况下,它们应该返回相同的结果。

更重要的是,Snowflake对COUNT函数进行了特殊的优化。据我所知,即使您使用COUNT(*)或COUNT(column),它也不会不会影响性能,即使列中包含NULL值也是如此!对于这两者,Snowflake使用METADATA统计信息,因此它实际上并不计算行数。

您可以使用SNOWFLAKE_SAMPLE_DATA对其进行测试:

select count(*) from snowflake_sample_data.TPCH_SF1000.LINEITEM;
-- 5999989709

select count(L_ORDERKEY) from snowflake_sample_data.TPCH_SF1000.LINEITEM;
-- 5999989709

这两个查询都将立即返回结果,尽管表大小约为170G,并且包含5G以上的行。