“TABLESAMPLE BERNOULLI(1)”不是很随机吗?

1 postgresql

每当我需要从表中返回随机记录并且性能很重要时,而不是:

SELECT column FROM table ORDER BY random() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我经常做:

SELECT column FROM table TABLESAMPLE BERNOULLI(1) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

速度快多了,但似乎不是很随机?看起来重复使用此方法时会返回很多相同的记录。是我一个人的问题,还是这种方法的随机性要低得多(因此用处不大)?

mus*_*cio 5

返回一行的概率TABLESAMPLE BERNOULLI(1)为1/100,即0.01。的存在LIMIT 1告诉 Postgres 在第一场比赛后停止读取表格。这意味着平均将检索表中前 100 行(无论引擎扫描它们的顺序)之一。

ORDER BY random() LIMIT 1另一方面,之后返回任何特定行的概率为 1/C,其中 C 是表基数。将读取整个表并随机排序,然后返回一行。这意味着,如果您的表超过 100 行,则将ORDER BY random()从更广泛的选择中返回一行(或者,正如您所说,将“更加随机”)。

这里有一些背景信息。