DB2 com cláusula
sou novo no DB2 e tenho uma pergunta sobre a cláusula com. Por exemplo, na seguinte consulta:
WITH values AS
(
SELECT user_id, user_data FROM USER WHERE user_age < 20
)
SELECT avg(values.user_data) FROM values
UNION
SELECT sum(values.user_data) FROM values
Quantas vezes será executada a expressão da tabela comum? O resultado da cláusula Com será armazenado numa tabela temporária ou fará a sub-selecção duas vezes.
(Eu uso com e união aqui apenas para dar um exemplo, e desculpe pelo meu pobre Inglês)
2 answers
Em DB2, as expressões de tabela comuns devem criar o nó de expressão de tabela comum no plano de execução (ver a documentação aqui). Este nó diz explicitamente:
Servem como tabelas intermédias. Tradicionalmente, uma tabela aninhada a expressão também serve este propósito. No entanto, uma tabela comum a expressão pode ser referenciada várias vezes depois de instanciada; as expressões das tabelas aninhadas não podem.
Li isto como dizendo que o CTE é apenas avaliado uma vez, instanciado, e depois usado várias vezes. Além disso, se o CTE é referenciado apenas uma vez, a "instanciação" é otimizada.
Note que esta é a forma como os Postgres lidam com os Eti (subqueries materializadas) e não a forma como o servidor SQL os lida.