2014-02-24 169 views
2

我是DB2的新手,我對子句有疑問。 例如在下面的查詢:DB2與條款

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 

多少次將公用表表達式執行?將with子句的結果存儲在一個臨時表中,否則它將執行兩次子選擇。 (我在這裏使用和聯合只是爲了舉一個例子,對不起我可憐的英語)

+0

執行它並查看計劃,在[tag:sql-server]中將執行兩次。 – 2014-02-24 21:04:35

回答

1

正如@Vladimir Oselsky所提到的,只有看執行計劃纔會給你一個明確的答案。在這個人爲的例子中,CTE子查詢可能會運行兩次。

+0

我認爲它會緩存結果,然後我看到與sql-server類似的答案。我將在明天檢查計劃... –

0

在DB2中,公用表表達式應​​在執行計劃中創建公用表表達式節點(請參閱文檔here)。該節點明確指出:

它們充當中間表。傳統上,嵌套表 表達式也用於此目的。但是,通用表 表達式在實例化後可以多次引用; 嵌套表格表達式不能。

我讀到這裏說CTE只評估一次,實例化,然後多次使用。而且,如果CTE僅被引用一次,則「實例化」被優化。

請注意,這是Postgres處理CTE(物化子查詢)的方式,而不是SQL Server處理它們的方式。

+0

爲了完整起見,此答案僅針對DB2 for z/OS。 dashDB中的 – mustaccio

+0

類似於DB2,表正在被多次掃描。 – Darek