Visão geral
Embora as otimizações de I/O mencionadas acima possam reduzir significativamente o volume de dados lidos, elas ainda pressupõem que todas as colunas das linhas que passam pela cláusula
WHERE precisam ser carregadas antes da execução de operações como ordenação, aggregation ou LIMIT. Mas e se algumas colunas só forem necessárias mais adiante, ou se alguns dados, apesar de passarem pela cláusula WHERE, nunca chegarem a ser necessários?
É aí que entra a materialização tardia. Trata-se de um aprimoramento ortogonal que completa a pilha de otimizações de I/O:
- A indexação, em conjunto com
PREWHERE, garante que apenas as linhas que correspondem aos filtros de coluna na cláusulaWHEREsejam processadas. - A materialização tardia se baseia nisso ao adiar as leituras de colunas até que elas sejam realmente necessárias no plano de execução da consulta.
Mesmo após a filtragem, apenas as colunas necessárias para a próxima operação - como ordenação - são carregadas imediatamente.
As demais são adiadas e, devido ao
LIMIT, muitas vezes são lidas apenas parcialmente, apenas o suficiente para produzir o resultado final. Isso torna a materialização tardia especialmente poderosa para consultas Top N, em que o resultado final pode exigir apenas algumas linhas de determinadas colunas, muitas vezes grandes.
Um exemplo prático
PREWHERE, uma consulta precisa de filtros: em colunas de chave primária para indexação e em quaisquer colunas para PREWHERE.
materialização tardia se aplica de forma natural sobre essas otimizações, mas, diferentemente das outras otimizações mencionadas anteriormente, também pode acelerar consultas sem nenhum filtro de coluna.
Considere a consulta de exemplo a seguir, que encontra avaliações da Amazon com o maior número de votos úteis, independentemente de data, produto, nota ou status de verificação, e retorna as 3 principais com seu título, subtítulo e texto completo.
Primeiro, execute a consulta (com caches frios do filesystem) com materialização tardia desativada (usando query_plan_optimize_lazy_materialization):
Query
Response
Query
Response
Como confirmar a materialização tardia no plano de execução da consulta
EXPLAIN: