gpt4 book ai didi

asp.net - 计算列中不同值的最快方法,包括 NULL 值

转载 作者:太空狗 更新时间:2023-10-30 01:43:42 26 4
gpt4 key购买 nike

Transact-Sql Count Distinct操作计算列中的所有非空值。我需要计算一组表中每列的不同值的数量,包括空值(所以如果列中有空值,结果应该是 (Select Count(Distinct COLNAME) From TABLE) + 1

这将在数据库中每个表的每一列上重复。包括数百个表,其中一些表的行数超过 100 万。因为这需要在每一列上完成,所以为每一列添加索引不是一个好的选择。

这将作为 ASP.net 站点的一部分完成,因此与代码逻辑的集成也是可以的(即:这不必作为一个查询的一部分完成,但如果可以以良好的性能完成,然后甚至更好)。

最有效的方法是什么?


测试后更新

我根据一张很好的代表性表格上给出的答案测试了不同的方法。该表有 320 万条记录,数十列(少数有索引,大多数没有)。一列有 320 万个唯一值。其他列的范围从所有 Null(一个值)到最多 40K 个唯一值。对于每种方法,我执行了四次测试(每次尝试多次,对结果求平均值):一次 20 列,一次 5 列,1 列有很多值 (3.2M) 和 1 列有少量值 ( 167).以下是结果,按照最快到最慢的顺序

  1. Count/GroupBy ( Cheran )
  2. CountDistinct+SubQuery ( Ellis )
  3. dense_rank ( Eriksson )
  4. Count+Max ( Andriy )

测试结果(以秒为单位):

   Method          20_Columns   5_Columns   1_Column (Large)   1_Column (Small)
1) Count/GroupBy 10.8 4.8 2.8 0.14
2) CountDistinct 12.4 4.8 3 0.7
3) dense_rank 226 30 6 4.33
4) Count+Max 98.5 44 16 12.5

注意事项:

  • 有趣的是,最快的两种方法(到目前为止,两者之间只有很小的差异)都是为每一列提交单独查询的方法(在结果 #2 的情况下,查询包含一个子查询,所以实际上每列提交了两个查询)。可能是因为与内存需求方面的性能损失相比(只是猜测),通过限制表扫描次数获得的 yield 很小。
  • 虽然 dense_rank 方法绝对是最优雅的,但它似乎不能很好地扩展(查看 20 列的结果,这是四种方法中最差的),即使在小范围内也不能与 Count 的性能竞争。

感谢您的帮助和建议!

最佳答案

SELECT COUNT(*)
FROM (SELECT ColumnName
FROM TableName
GROUP BY ColumnName) AS s;

GROUP BY 选择不同的值,包括 NULL。 COUNT(*) 将包含 NULL,而 COUNT(ColumnName) 则忽略 NULL。

关于asp.net - 计算列中不同值的最快方法,包括 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com