概率:使用随机样本估算NoSQL查询大小/计数

时间:2019-07-01 05:41:51

标签: database count nosql probability

我有一个非常大的NoSQL数据库。数据库中的每个项目都分配了一个介于0和1之间的均匀分布的随机值。此数据库太大,以至于对查询执行COUNT不会产生可接受的性能,但是我想使用随机值来估算COUNT

想法是这样的:

  1. 运行查询并按随机值对查询进行排序。索引随机值,因此速度很快。
  2. 使用最低的N值,例如R,看看最大的值有多大。
  3. COUNT估计为N / R

问题有两个:

  1. N / R是估算COUNT的最佳方法吗?也许应该是(N+1)/R?也许我们可以查看其他值(平均值,方差等),而不仅仅是最大值以获得更好的估计?
  2. COUNT的估计值的误差范围是多少?

注意:我曾考虑过将其发布在数学堆栈交换中,但鉴于这是针对数据库的,因此我认为在这里更合适。

1 个答案:

答案 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))。如果我们假设Rn大得多,那么大约是n R / R^3 = n / R^2。这意味着我们的标准偏差为sqrt(n) / R

如果x是我们的订单统计信息,则意味着(n / x) - 1R的合理估计。多少钱呢?好吧,我们可以使用切线近似。函数(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)的误差。