test=# create table r (id serial primary key, x int, y int);
CREATE TABLE
test=# insert into r (x, y) select random() * 1000, random() * 1000 from generate_series(0, 1000000);
INSERT 0 1000001
test=#
test=# create index r_x_idx on r using btree (x);
CREATE INDEX
test=# cluster r using r_x_idx ;
CLUSTER
test=# select * from r limit 5;
id | x | y
------+---+-----
79 | 0 | 556
5997 | 0 | 774
6104 | 0 | 75
6937 | 0 | 818
7859 | 0 | 598
(5 rows)
test=# select * from r limit 5 offset 10000;
id | x | y
--------+----+-----
483314 | 10 | 842
484136 | 10 | 741
484568 | 10 | 729
488499 | 10 | 311
489022 | 10 | 613
(5 rows)
test=# select * from r limit 5;
id | x | y
--------+---+-----
330361 | 9 | 614
330928 | 9 | 48
331658 | 9 | 712
332175 | 9 | 448
332818 | 9 | 920
(5 rows)
Conforme mostrado acima, criei a tabela r
, depois criei um índice b+tree na coluna x
, e então agrupei a tabela usando esse índice. Como esperado, quando executei select * from r limit 5;
obtive registros com o menor x
valor, porque a ordem física dos registros agora é baseada na x
coluna (mais precisamente, com base no índice b+tree na coluna x
). Mas depois de executar select * from r limit 5 offset 10000;
, a ordem dos registros é alterada, sem nenhuma inserção. Alguém pode explicar esse comportamento?