MATERIALIZE
La cláusula MATERIALIZE permite crear una tabla temporal con el contenido de una subconsulta. Es decir, antes de la ejecución de la consulta, se crean las tablas temporales necesarias y finalmente se ejecuta la consulta utilizando dichas tablas. Esta estrategia de carga simplifica el plan de ejecución del motor de base de datos y se pueden obtener mejoras de rendimiento muy significativas, sin penalizar o dificultar la escritura de la consulta.
SELECT SalesOrderHeader.OrderDate, Product.Name Product, Product.ProductNumber, sum(Sales.LineTotal) SalesFROM staging.SalesOrderDetail FILTER (year(ModifiedDate)=2014) MATERIALIZE SalesINNER JOIN staging.SalesOrderHeader USING SalesOrderIdINNER JOIN staging.Product USING ProductIdVer SQL compilado
-- Materialized query: SalesSELECT *INTO #Sales__39872FROM (SELECT * FROM staging.SalesOrderDetail WHERE year(ModifiedDate)=2014) SalesOrderDetail
SELECT SalesOrderHeader.OrderDate AS OrderDate, Product.Name AS Product, Product.ProductNumber AS ProductNumber, sum(Sales.LineTotal) AS SalesFROM #Sales__39872 SalesINNER JOIN staging.SalesOrderHeader ON (Sales.SalesOrderId=SalesOrderHeader.SalesOrderId)INNER JOIN staging.Product ON (Sales.ProductId=Product.ProductId)GROUP BY SalesOrderHeader.OrderDate, Product.Name, Product.ProductNumberCon la cláusula MATERIALIZE, también se pueden materializar las consultas de una sentencia COMBINE. En este ejemplo, primero se ejecutará la consulta con las ventas, luego se ejecutará una consulta con las compras, y finalmente se combinarán en un único resultado.
COMBINE bY Product,productNumber MATERIALIZE sales ( select Product.Name Product, Product.ProductNumber ProductNumber, sum(PurchaseOrderDetail.LineTotal) Purchases from staging.PurchaseOrderDetail inner join staging.Product using ProductId ), MATERIALIZE purchases ( select Product.Name Product, Product.ProductNumber ProductNumber, sum(SalesOrderDetail.LineTotal) Sales from staging.SalesOrderDetail inner join staging.Product using ProductId )Ver SQL compilado
-- Materialized query: salesSELECT Product.Name AS Product, Product.ProductNumber AS ProductNumber, sum(PurchaseOrderDetail.LineTotal) AS PurchasesINTO #sales__D83E4FROM staging.PurchaseOrderDetailINNER JOIN staging.Product ON (PurchaseOrderDetail.ProductId=Product.ProductId)GROUP BY Product.Name, Product.ProductNumber
-- Materialized query: purchasesSELECT Product.Name AS Product, Product.ProductNumber AS ProductNumber, sum(SalesOrderDetail.LineTotal) AS SalesINTO #purchases__1CD26FROM staging.SalesOrderDetailINNER JOIN staging.Product ON (SalesOrderDetail.ProductId=Product.ProductId)GROUP BY Product.Name, Product.ProductNumber
SELECT coalesce(sales.Product,purchases.Product) AS Product, coalesce(sales.ProductNumber,purchases.ProductNumber) AS ProductNumber, sales.Purchases AS Purchases, purchases.Sales AS SalesFROM #sales__D83E4 salesFULL JOIN #purchases__1CD26 purchases ON (sales.Product=purchases.Product AND sales.ProductNumber=purchases.ProductNumber)