Jump to content
Fórum Script Brasil
  • 0

Problema Paginação Postgre com Offset


TeraHertz
 Share

Question

Pessoal sou novato no postgre, meu problema é o seguinte:

Tenho uma tabela com 45+ milhões de registros, usando as cláusulas LIMIT e OFFSET posso paginar até uns 150.000 registros sem uma perda de performance.

Porém acima disso (falta muiiitoo para chegar nos 45+ milhões) é impraticável....

Como soluciono isso ? procedures ? cursores ? functions ?

Gostaria da opinião de vocês já pesquisei muito porém todos os exemplos de paginação que encontrei utilizam LIMIT e OFFSET... o pessoal que souber outras formas deêm uma mão e também deixem um exemplo de como fazer, pois sou novato.

OBS: a tabela já possui indice, pelo que pesquisei utilizando OFFSET a consulta fica lenta por causa que simplesmente ela percorre todos os registros 0...m e só mostra apartir do OFFSET passado, precisaria algo como percorrer somente apartir do offset passado ai sim não teria problemas.

AGUARDO AJUDA !!!

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

O mais simples é tentar restringir ao máximo o conjunto com uma condição no WHERE. A alternativa não é trivial. Uma solução é criar uma coluna de inteiros com a ordenação desejada e quando for consultar usar esta coluna na cláusula WHERE:

create table t (id int, name text, ordem_name int unique);

insert into t (id, name) values
(1, 'fulano'),(2, 'sicrano'),(3, 'beltrano')
;

update t
set ordem_name = s.ordem
from (
    select id, row_number() over(order by name) as ordem
    from t
) s
where t.id = s.id
;

select * from t;
 id |   name   | ordem_name 
----+----------+------------
  1 | fulano   |          2
  2 | sicrano  |          3
  3 | beltrano |          1
(3 rows)
Agora use a cláusula where para fazer o OFFSET e o LIMIT
select *
from t
where ordem_name >= 2 and ordem_name < 2 + 2
;
 id |  name   | ordem_name 
----+---------+------------
  1 | fulano  |          2
  2 | sicrano |          3
(2 rows)

O update deverá ser feito regularmente, por exemplo a cada 3 horas. Se for necessário manter sempre atualizado então a coluna ordem_name deve ser uma função.

Edited by Kakao
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.8k
    • Total Posts
      648.7k
×
×
  • Create New...