Expressões de tabela comuns do PostgreSQL versus uma tabela temporária?

11

A documentação do PostgreSQL no WITH mostra o seguinte exemplo:

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

Também observa:

Uma propriedade útil das consultas WITH é que elas são avaliadas apenas uma vez por execução da consulta pai, mesmo que sejam referidas mais de uma vez pela consulta pai ou pelo irmão FROM.

Vejo que WITHpode ser usado para outras coisas, como avaliação recursiva. Mas no exemplo acima, há alguma diferença importante entre usar WITHe criar tabelas temporárias?

Nathan Long
fonte
quando você usa o CTE para criar a consulta, adicionar outra coluna ao SELECTin WITHé apenas digitar o nome e executar novamente. Enquanto com tabela temporária seria preciso DROPe CREATE. Por outro lado, se você criar uma consulta e reutilizar dados estáticos muitas vezes - criar tabelas temporárias com índices é definitivamente benéfico para o CTE.
Vao Tsun
@VaoTsun se estiver usando TEMPORARY TABLEcom ON COMMIT DROPuma consulta, também é apenas uma questão de modificar a consulta e re-executar, certo? postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

Respostas:

16

Existem algumas diferenças sutis, mas nada drástico:

  • Você pode adicionar índices em uma tabela temporária;
  • As tabelas ON COMMIT DROPtemporárias existem para a vida útil da sessão (ou, se , transação), em que o escopo WITHé sempre estritamente restrito à consulta;
  • Se uma consulta chama uma função / procedimento, ele pode ver a tabela temporária, mas pode não ver qualquer WITHmesa de expressões;
  • Uma tabela temporária gera VACUUMtrabalho nos catálogos do sistema WITH, mas precisa de uma viagem extra para criá-la / preenchê-la, além de exigir trabalho extra no gerenciamento de cache do servidor, por isso é um pouco menos eficiente.

No geral, você deve preferir WITHtemp tabelas, a menos que saiba que se beneficiará da criação de um índice.

No entanto, a outra opção, uma subconsulta na FROMcláusula, tem um conjunto muito diferente de vantagens. Ele pode ser incorporado, em particular, e os qualificadores podem ser puxados para cima / pressionados. Eu escrevi sobre isso em um artigo recente do blog .

Craig Ringer
fonte
E as visualizações e visualizações temporárias?
precisa saber é o seguinte
11
Meio entre, mas mais perto de uma tabela temporária do que um termo CTE. Sem índices. Escopo da sessão. Visível para funções / procedimentos. Precisa de vácuo de catálogo.
Craig Ringer