由于SnowFlake是列式数据库,因此当您使用COUNT(*)vs COUNT(列)时,是否会影响性能?这是假设您要引用的列没有任何NULL
答案 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以上的行。