Precisamos de apoio das ferramentas para a paginação por conjunto de chaves

(Traduzido de We need tool support for keyset pagination)

Você sabia que a paginação via offset é muito problemática, mas fácil de evitar?

offset instrui os bancos de dados a pular os primeiros N resultados N de uma consulta. No entanto, o banco de dados ainda deve buscar essas linhas a partir do disco e trazê-los em ordem antes de ele pode enviar os seguintes.

Isto não é um problema de implementação, é a maneira na qual offset foi desenhado:

… As linhas são primeiro classificadas de acordo com a <cláusula order by> e, em seguida, limitada retirando-se o número de linhas especificadas na <cláusula offset> desde o início …

— SQL:2011, Part 2, §4.15.3 Derived tables

Em outras palavras, grandes offsets impõe um grande trabalho para o banco de dados, não importa se SQL ou NoSQL.

Mas o problema com offset não pára aqui: já pensou sobre o que acontece se uma nova linha é inserida entre duas páginas buscadas?

offset-drifting

Quando offset➌ é usado para ignorar as entradas❶ anteriores, você terá duplicações no caso de existirem novas linhas inseridas entre as duas páginas➋. Há outras anomalias possíveis também, este é apenas o caso mais comum.

Este nem é um problema de banco de dados, é a maneira como os frameworks implementam paginação: eles apenas dizem qual é o número da página a ser recuperada ou quantas linhas devem ser ignoradas. Com estas informações apenas, nenhum banco de dados pode fazer melhor.

Vida sem OFFSET

Agora imagine um mundo sem estes problemas. Como se constata, viver sem offset é bem simples: apenas utilize uma cláusula where que selecione apenas os dados que você ainda não viu.

Para isso, exploraremos o fato de que trabalhamos com um conjunto ordenado – você tem uma cláusula order by, não é? Uma vez que há uma ordenação definida, podemos usar um filtro simples para somente selecionar o que é posterior a entrada que vimos anteriormente.

SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY

Esta é a receita básica. Ele fica mais interessante quando a classificação é por várias colunas, mas a idéia é a mesma. Esta receita também é aplicável a muitos sistemas NoSQL.

Esta abordagem – chamada seek method ou keyset pagination – resolve o problema de derivação de resultados como ilustrado acima e é ainda mais rápido do que offset. Se você quer saber o que acontece dentro do banco de dados ao usar offset ou keyset pagination, dê uma olhada nestes slides (benchmarks, benchmarks!):

No slide 43 você também pode ver que keyset pagination tem algumas limitações: mais notavelmente que você não pode navegar diretamente para páginas arbitrariamente. No entanto, isto não é um problema quando se utiliza rolagem infinita. Mostrar o número de páginas para serem clicadas é uma interface de navegação pobre, na minha humilde opinião.

Se você quiser ler mais sobre como implementar corretamente keyset pagination em SQL, por favor fetch-next-page. Mesmo que você não esteja envolvido com o SQL, vale a pena ler fetch-next-page antes de começar a implementar qualquer coisa.

No entando, os frameworks

A principal razão para preferir offset a paginação por conjunto de chaves (keyset pagination) é a falta de suporte. A maioria das ferramentas de paginação são baseadas em offset, mas não oferecem nenhuma maneira conveniente para a utilização de paginação por conjunto de chaves.

Por favor, note que a paginação por conjunto de chaves afeta toda a tecnologia envolvida na execução de JavaScript do navegador que esteja fazendo a requisição AJAX para rolagem infinita: ao invés de simplesmente passar um número de página para o servidor, você deve passar o conjunto de chaves completo (geralmente múltiplas colunas) para o servidor.

O hall da fama de frameworks que suportam paginação por conjunto de chaves é ainda pequeno:

É por isto que preciso da sua ajuda. Se você estiver mantendo um framework que tem algum envolvimento com paginação, eu peço, eu imploro, que você construa um suporte nativo para navegação por conjunto de chaves também. Se você tiver quaisquer perguntas sobre detalhes, ficarei feliz em ajudar (forum, contact form, Twitter)!

Mesmo que você esteja apenas utilizando um software que deveria suportar paginação por conjunto de chaves, como um gerenciador de conteúdos ou uma loja virtual, faça os mantenedores saberem sobre isso. Você poderia fazer uma requisitação da funcionalidade (link a esta página) ou, se possível, desenvolva um patch. Novamente, ficarei feliz em ajudar a ter todos os devidos detalhes.

Tome WordPress como um exemplo.

Espalhe a palavra

O problema com a paginação de conjunto de chaves não é técnico. O problema é que é pouquíssimo conhecido no meio e não há suporte das ferramentas. Se você gosta da idéia de evitar o uso de paginação por offset, por favor, ajude a espalhar a palavra. Use o Twitter, compartilhe, envie por e-mail, você pode até reproduzir este post (CC-BY-NC-ND). Traduções são também bem-vindas, apenas faça um contato prévio – eu também incluirei o link da tradução a esta página.

Ah, e se você estiver em um blog, você também pode acrescentar um banner para que seus leitores fiquem alertas a isto. Eu preparei uma a galeria de banner NoOffset com alguns formatos comuns. Escolha o que ficar melhor.

Tropeçando 68

PG Phriday: 10 Ways to Ruin Performance: Functionally Bankrupt

O uso inadequado de funções em consultas e índices e que arruinam a performance do banco.

A arte da linha de comando

Fluência na linha de comando é uma habilidade muitas vezes negligenciada ou considerada obsoleta, porém ela aumenta sua flexibilidade e produtividade como desenvolvedor de diversas maneiras, sutis ou não. Este texto descreve uma seleção de notas e dicas de uso da linha de comando que me parecem muito uteis, quando usando o Linux. Algumas dicas são elementares, e outras são mais específicas, sofisticadas ou obscuras. Esta página é curta, mas se você souber usar e lembrar todos os items que estão aqui, então você está mandando bem.

Verify that a network connection is secure

Através da captura dos pacotes que trafegam na rede em que você está conectado, verifique se há vulnerabilidades e a  possibilidade de desvio das informações quando você está usando protocolos de encriptação.

7 Essential JavaScript Functions

Funções JavaScript utilíssimas: debounce, poll, once, getAbsoluteURL, isNative, insertRule, matchesSelector

PG Phriday: Partitioning Candidates

Entendendo quando tabelas são boas candidatas ao particionamento

Tropeçando 66

How to access a Linux server behind NAT via reverse SSH tunnel

Post a message to another users screen via SSH

How to setup SSL connections and authentication?

Configurar conexões e autenticações SSL no PostgreSQL. Camada de segurança para troca de informações criptografadas.

Aprenda como interligar dois locais através de uma VPN

Postgresql Restore – Restaurando o backup incremental PITR (9.2, 9.3 e 9.4)

Tropeçando 65

Descarte móveis, eletrônicos, eletrodomésticos e muitos outros objetos velhos sem sair de casa

The history of replication in PostgreSQL

Taming Forms in AngularJS 1.3

Ultimo Dia Util Considerando Feriados em Oracle PL/SQL

HTTP access control (CORS)

Detalhes do lado do cliente na utilização de CORS.

CORS on Apache

Use vimdiff as git mergetool

Instruções para utilizar vimdiff como resolvedor de conflitos do GIT

git ahead/behind info between master and branch?

Ter a informação de quantos commits há atrás/adiante do seu branch no git

GNS3 1.3 – A ferramenta perfeita para quem gosta de redes

O GNS3 é um simulador de redes bastante “real”, que emula os mais diversos equipamentos activos de uma rede: routers, switchs, PCs, telefones, firewalls, etc. Considerando por exemplo um router, o GNS3 permite-nos emular o IOS (sistema operativo dos equipamentos Cisco) de um router real e proceder às respectivas configurações.

Compressor.io

Compressão de imagens em formato otimizado com menor perda possível (quando não sem perda).

Tropeçando 64

Oracle X PostgreSQL – Parte I: Semelhanças

Flash atualizado no Linux: Tenha a versão mais recente com o Fresh Player Plugin

How to Recover an Encrypted Home Directory on Ubuntu

Recovering an encrypted home directory when you don’t have the former operational system anymore. Or you are accessing through an external hard driver or something else.

Tag All The Things
Tag All The Things 2
Tag All The Things 3

Série AngularJS: Filter ordenando tabela por coluna

Problema do ano 2038

Playing around with ~/.gvfs/

Building Huuuuuge Apps with AngularJS

Partial aggregation: The beautiful way

I have PostgreSQL, loaded some data, and have app using it. Now what?

Agora que o banco já está no ar e sendo usado, é muito importante cuidar da sua saúde. Vamos, portanto, aplicar:

  • streaming replication de master para slave
  • walarchiving para o servidor storage deixando-o disponível para recuperação por backup
  • walarchiving para o servidor slave para que no caso do slave cair, será possível a recuperação sem que seja necessário refazer a replicação
  • limpeza de walarchive no slave – xlogs desnecessários serão removidos
  • backups diários, executados a partir do slave e salvos no servidor storage, sem que haja nenhum trabalho adicional no master (excetuando-se iniciar e encerrar o modo de backup, o que não afeta o desempenho normal do master)
  • backups e walarchive no storage são mantidos em sincronia (sem xlogs que são inúteis) e pequenos o suficiente

Tropeçando 63

Garbage Collection of Unused PostgreSQL Tables and Columns

Química na remoção de manchas em roupas

Remapping Caps Lock in 14.04 Trusty Tahr

Remaping keys: capslock to escape and viceversa in Ubuntu 13.10 [duplicate]

Dillinger – Online Markdown Editor

Paiza, plataforma para programar sem precisar instalar nada

Waiting for 9.4 – Add support for wrapping to psql’s “extended” mode.

PostgreSQL: A full text search engine – Part 1

How much slower are numerics?

The story of pgAdmin

Tropeçando 62

A Small Database Does Not Mean Small shared_buffers

Another mantra often heard in PostgreSQL circles is that you usually don’t want to set shared_buffers higher than 8GB. I will admit, that for a majority of users, that is great advice and a good starting point (and a whole lot more useful than the default 32MB).

Changing Owner of Multiple Database Objects

pgAFIS: o Elefante Biométrico

I want to add CORS support to my server

Carta aos Presidenciáveis: Por que desprezam quem precisa de acessibilidade?

Da Lêda Spelta:

Caríssimos candidatos Dilma Rousseff, Marina Silva e Aécio Neves,

Desalentada com a escassez de informações apresentadas nos programas eleitorais, resolvi acessar os sites oficiais de campanha, na esperança de encontrar esclarecimentos sobre as principais diferenças programáticas, ou seja, sobre o que eu poderia esperar do futuro do Brasil com cada um dos senhores na presidência, já que são os candidatos com chances reais nessa eleição. E decidi começar pelo site da Presidenta Dilma…

Continue a leitura no site da Acesso Digital: Carta aos Presidenciáveis: Por que desprezam quem precisa de acessibilidade?

Encontrei no fechaTag.