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