O comportamento da cerca de otimização de um CTE (WITH query) especificado no padrão SQL: 2008? Se sim, onde?

23

Eu vejo referências freqüentes a WITHconsultas (expressões comuns de tabela ou CTEs) atuando como uma cerca de otimização, onde o servidor não tem permissão para enviar filtros para as consultas CTE, extrair expressões comuns do CTE etc. ser um comportamento exigido pelos padrões SQL.

Definitivamente, as CTEs são uma barreira de otimização no PostgreSQL ... mas isso é exigido pelo padrão ou, na verdade, apenas detalhes de implementação?

Por exemplo, essas postagens na lista de discussão afirmam ou sugerem que é padrão:

Depois de mencioná-lo em um comentário , perguntaram-me onde é especificado - e, depois de analisar o único rascunho do SQL: 2008, tenho acesso e não estou tendo muita sorte em encontrá-lo.

Ainda não estudei intensivamente o padrão, por isso espero uma sugestão de alguém que tenha: A vedação de otimização de CTEs no PostgreSQL é realmente exigida pelo padrão? E se sim, onde está especificado? Ou as instruções da lista de correspondência da Pg estão erradas?

Veja também a cerca de otimização CTE do thread na lista de tarefas? .

Craig Ringer
fonte

Respostas:

10

Eu acho que é um detalhe de implementação.

Uma implementação em conformidade não é necessária para executar a sequência exata de ações definida nas Regras Gerais, desde que seu efeito nos dados e esquemas SQL, nos parâmetros e nas variáveis ​​do host e nos parâmetros e variáveis ​​SQL seja idêntico ao efeito disso. seqüência. O termo é usado efetivamente para enfatizar ações cujo efeito pode ser alcançado de outras maneiras por uma implementação. 1

Eu acho que um implementador poderia avaliar uma expressão de tabela comum 20 vezes, mesmo de 20 maneiras diferentes, e ainda ter uma implementação em conformidade. A única questão relevante é se "seu efeito ... é idêntico ao efeito" da sequência de ações definida nas regras gerais.

[1] Seção 6.3.3.3, "Ordem de avaliação de regra", em um rascunho do padrão SQL 2008, com o nome de arquivo local 5CD2-01-Framework-2006-01.pdf, p. 41 Não faço ideia de onde consegui. O Google pode saber.

Mike Sherrill 'Recorde Gato'
fonte
2
Esse sentido makese - e como o PostgreSQL permitirá o uso de funções com efeitos colaterais ou declarações de modificação de dados nos CTEs, ele deve cercar esses CTEs. Eu acho que isso significa que seria livre para CTEs em linha que chamam apenas STABLEou IMMUTABLEfuncionam.
Craig Ringer
Eu acho que CTEs graváveis ainda não estão em nenhum padrão SQL, mas não sou positivo.
Mike Sherrill 'Recall Cat'
Os wCTEs são certamente uma extensão do PostgreSQL. É menos claro se as funções que executam o DML são, já que as funções definidas pelo usuário no SQL são as SQL/PSMquais a Pg não suporta ...
Craig Ringer