我有一个非常大的NoSQL数据库。数据库中的每个项目都分配了一个介于0和1之间的均匀分布的随机值。此数据库太大,以至于对查询执行COUNT
不会产生可接受的性能,但是我想使用随机值来估算COUNT
。
想法是这样的:
N
值,例如R
,看看最大的值有多大。COUNT
估计为N / R
问题有两个:
N / R
是估算COUNT
的最佳方法吗?也许应该是(N+1)/R
?也许我们可以查看其他值(平均值,方差等),而不仅仅是最大值以获得更好的估计?COUNT
的估计值的误差范围是多少?注意:我曾考虑过将其发布在数学堆栈交换中,但鉴于这是针对数据库的,因此我认为在这里更合适。
答案 0 :(得分:2)
这实际上在交换数学或统计信息堆栈方面会更好。
合理的估计是,如果R
很大并且x
是您的订单统计信息,那么R
大约是n / x - 1
。大约95%的时间错误将在此2 R / sqrt(n)
之内。因此,查看第100个元素将估计正确答案在20%以内。查看第10,000个元素,它将估计在2%的范围内。而百万分之一的元素将使您在大约0.2%的范围内获得正确的答案。
要查看此信息,请首先查看带有参数? = n
和β = R + 1 - n
的{{3}}。这意味着R
个值中第n个最小值的平均值为n/(R+1)
。其方差为?β / ((? + β)^2 (? + β + 1))
。如果我们假设R
比n
大得多,那么大约是n R / R^3 = n / R^2
。这意味着我们的标准偏差为sqrt(n) / R
。
如果x
是我们的订单统计信息,则意味着(n / x) - 1
是R
的合理估计。多少钱呢?好吧,我们可以使用切线近似。函数(n / x) - 1
的导数为- n / x^2
,因此它在x = n/(R+1)
的导数为(R + 1)^2 / n
。对于大R
来说,大致是R^2 / n
。坚持我们的标准偏差sqrt(n) / R
,我们得出与R / sqrt(n)
成比例的误差。由于95%的置信区间为2个标准差,因此您可能会有大约2 R / sqrt(n)
的误差。