Count(*) returns 每次执行的不同结果

Count(*) returns different results at each execution

请注意:这个问题是关于 PostgreSQL 和 pgAdmin4 的,所以它不是 的副本,它是关于 [=22] =].


我有大约 4,000,000 条记录table。以下 SQL 查询:

SELECT COUNT(*) FROM (SELECT * FROM log LIMIT 40000)a WHERE some_column = true

returns 每次执行时的值都不一样。有什么问题,我该如何解决?

这是您的查询:

SELECT COUNT(*)
FROM (SELECT * FROM log LIMIT 40000)a
WHERE some_column = true

子查询返回一个 任意 组 40,000 行。每次执行查询时,这个集合都是不同的。如果你想要一个规范集,你需要 ORDER BY 和唯一的排序键。

你是事后过滤,符合你条件的数字是任意的。

如果您想要任意一组 40,000 行且条件为真,只需执行以下操作:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      LIMIT 40000
     ) ;

如果你想要一个随机 40,000 行的集合,你可以这样做:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      ORDER BY random() 
      LIMIT 40000
     ) ;

任意 <> 随机。 (注意:这很昂贵;有更便宜的方法来获得随机集。)。

如果您想要一个可重复的样本,那么,有多种方法可以做到这一点。一种是按唯一 ID 之类的东西排序,并取前 40,000 行:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log l
      WHERE some_column = true
      ORDER BY primary_key
      LIMIT 40000
     ) ;

这不是随机样本,只是可重复样本。