Postgres - 相同的查询 returns 一次又一次 运行 不同的结果

Postgres - Same query returns different results when run again and again

在为我的新项目试验 PostgreSQL 时,我遇到了以下查询执行行为。我想知道为什么同一个查询returns时的值不同运行一次又一次?这种行为背后的理性是什么?

phi=# SELECT P.id, p.resource ->> 'birthDate' BD FROM recorditems P WHERE  P.resource @> '{"resourceType":"Patient", "gender":"male"}' AND To_date(P.resource ->> 'birthDate', 'YYYY-MM-DD') > '1975-01-01'::date limit 10;
   id   |     bd
--------+------------
 363661 | 1990-03-08
 363752 | 2006-02-28
 364971 | 2017-10-21
 365330 | 1996-11-25
 367793 | 2007-10-02
 369002 | 2006-09-04
 369172 | 1983-09-10
 369256 | 2001-05-19
 369670 | 1992-03-21
 372082 | 2011-07-27
(10 rows)

Time: 15.085 ms
phi=# SELECT P.id, p.resource ->> 'birthDate' BD FROM recorditems P WHERE  P.resource @> '{"resourceType":"Patient", "gender":"male"}' AND To_date(P.resource ->> 'birthDate', 'YYYY-MM-DD') > '1975-01-01'::date limit 10;
   id   |     bd
--------+------------
 372082 | 2011-07-27
 372645 | 1988-11-02
 373528 | 1984-07-11
 376213 | 1982-01-03
 377386 | 1995-01-20
 377531 | 2002-02-11
 377717 | 1991-11-15
 378372 | 2018-09-27
 378483 | 2009-01-11
 378743 | 1996-02-27
(10 rows)

Time: 18.163 ms 
phi=# SELECT P.id, p.resource ->> 'birthDate' BD FROM recorditems P WHERE  P.resource @> '{"resourceType":"Patient", "gender":"male"}' AND To_date(P.resource ->> 'birthDate', 'YYYY-MM-DD') > '1975-01-01'::date limit 10;
   id   |     bd
--------+------------
 378743 | 1996-02-27
 382517 | 1992-01-14
 387866 | 1985-07-03
 388180 | 1976-11-01
 388627 | 1996-07-10
 396668 | 1979-03-29
 396754 | 2013-05-16
 397054 | 1998-01-05
 401771 | 1983-11-28
 401891 | 2019-03-01
(10 rows)

Time: 44.394 ms

您没有对结果进行排序。没有 ORDER BY LIMIT return (看似)随机结果,因为 table 的行未排序。

如果您想使用 LIMIT 获得一致的结果,您 还需要 使用 ORDER BY

当您或多或少同时(松散定义)针对同一个 table 执行多个顺序扫描时,PostgreSQL 会尝试同步它们,以便它们都可以从相同的预热缓存中受益.如果您使用 set synchronize_seqscans TO off 关闭此功能,您可能会得到更多 predictable 结果。但是你在这里的原罪是期待订单,而你并没有请求订单。