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)

Author: a_horse_with_no_name, 2014-02-25

2 answers

Como @Vladimir Oselsky mencionou, só olhar para o plano de execução lhe dará uma resposta definitiva. Neste exemplo contried o subconselect CTE corre provavelmente duas vezes.
 1
Author: mustaccio, 2014-02-24 21:12:22

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.

 0
Author: Gordon Linoff, 2014-02-24 21:17:02