Sql-Server

除了和相交:邏輯計劃中被動投影的目的

  • April 17, 2020

下面的 EXCEPT 查詢生成了一個看似毫無目的的投影的邏輯計劃。INTERSECT 也會出現這種情況。

投影的目的是什麼?例如,是否有一個不同的 EXCEPT 查詢,其中外部投影會指定某些內容?

詢問:

use AdventureWorks2017

select p.ProductId
from Production.Product as p
except
select pinv.ProductID
from Production.ProductInventory as pinv
option (recompile, querytraceon 8605, querytraceon 3604)

轉換樹:

   LogOp_Select

       LogOp_GbAgg OUT(QCOL: [p].ProductID,) BY(QCOL: [p].ProductID,)

           LogOp_Project -- << ?? PASSIVE PROJECTION ??

               LogOp_Project

                   LogOp_Get TBL: Production.Product(alias TBL: p) Production.Product TableID=482100758 TableReferenceID=0 IsRow: COL: IsBaseRow1000 

                   AncOp_PrjList 

               AncOp_PrjList 

           AncOp_PrjList 

       ScaOp_Exists 

           LogOp_Select

               LogOp_Project

                   LogOp_Get TBL: Production.ProductInventory(alias TBL: pinv) Production.ProductInventory TableID=914102297 TableReferenceID=0 IsRow: COL: IsBaseRow1001 

                   AncOp_PrjList 

               ScaOp_Comp x_cmpEq

                   ScaOp_Identifier QCOL: [p].ProductID

                   ScaOp_Identifier QCOL: [pinv].ProductID

我們在查詢優化器內部做了很多事情,這些事情並沒有我們可以在外部解釋的原因。您在優化器中看到的項目最終會在優化器結束時被重寫以“展平”表達式。因此,優化器在搜尋中有一些東西是程式碼實現方式的一部分,這些東西可能會引入額外的項目,這些項目在功能上並沒有真正做任何事情,但確實允許我們將在優化器的一部分中創建一個子樹的地方縫合在一起但後來在原本不打算使用的地方使用。有一些物理實現細節可能會導致這種情況發生。就計劃質量而言,它們對使用者來說都不重要(幾乎在任何情況下 - 我們已經完成了使這些在搜尋中無關緊要的工作)。

所以,我只是揮揮手說“你不需要看他的身份。他可以做他的事。繼續前進”;)。

引用自:https://dba.stackexchange.com/questions/265126