如何使用union all和dense rank优化我的查询?

时间:2016-08-19 06:55:39

标签: sql sql-server tsql query-optimization query-performance

该查询正在执行3'(选择非索引视图)执行,我想知道你们是否知道可以优化什么?

SELECT 
    *
FROM
(
    SELECT 
        *,          
        DENSE_RANK() OVER (ORDER BY cmd.OrderYear, cmd.OrderSequence) R2
    FROM 
    (
        SELECT 
            Project1.*
         FROM 
         ( 
            SELECT Extent1.*
                FROM  
                    [WS].[viewOrderDetail] AS [Extent1]  
                WHERE 
                    [Extent1].CustomerID IN (2,7,8,9)    
           )  AS [Project1]
    ) AS [Cmd]  
    LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Year=[cmd].OrderYear AND [orders].[Sequence]=[cmd].OrderSequence)
    LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].[OrderYear] = [Cmd].[OrderYear] AND OrderLines.OrderSequence = Cmd.OrderSequence )
    LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp]  ON (Supp.OrderYear = OrderLines.OrderYear AND Supp.OrderSequence = OrderLines.OrderSequence AND Supp.OrderLineSequence= OrderLines.Sequence)
    WHERE CAST(Cmd.OrderYear as varchar(3)) +'.'+ right('000000' + CAST(Cmd.OrderSequence as varchar(6)),6) LIKE '%11301%'
) a
WHERE R2 >= (1 + 0) AND R2 < (1 + 20)

union all

SELECT 
    *
FROM
(
    SELECT 
        *,                                          
        DENSE_RANK() OVER (ORDER BY cmd.OrderYear, cmd.OrderSequence) R2
    FROM 
    (
        SELECT 
            Project1.*
         FROM 
         ( 
            SELECT Extent1.*
                FROM  
                    [WS].[viewOrderDetail] AS [Extent1]  
                WHERE 
                    [Extent1].CustomerID IN (2,7,8,9)    
           )  AS [Project1]
    ) AS [Cmd]  
    LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Year=[cmd].OrderYear AND [orders].[Sequence]=[cmd].OrderSequence)
    LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].[OrderYear] = [Cmd].[OrderYear] AND OrderLines.OrderSequence = Cmd.OrderSequence )
    LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp]  ON (Supp.OrderYear = OrderLines.OrderYear AND Supp.OrderSequence = OrderLines.OrderSequence AND Supp.OrderLineSequence= OrderLines.Sequence)
    WHERE Orders.Reference LIKE '%11301%'
) a
WHERE R2 >= (1 + 0) AND R2 < (1 + 20)


union all

SELECT 
    *
FROM
(
    SELECT 
        *,                                              
        DENSE_RANK() OVER (ORDER BY cmd.OrderYear, cmd.OrderSequence) R2
    FROM 
    (
        SELECT 
            Project1.*
         FROM 
         ( 
            SELECT Extent1.*
                FROM  
                    [WS].[viewOrderDetail] AS [Extent1]  
                WHERE 
                    [Extent1].CustomerID IN (2,7,8,9)    
           )  AS [Project1]
    ) AS [Cmd]  
    LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Year=[cmd].OrderYear AND [orders].[Sequence]=[cmd].OrderSequence)
    LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].[OrderYear] = [Cmd].[OrderYear] AND OrderLines.OrderSequence = Cmd.OrderSequence )
    LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp]  ON (Supp.OrderYear = OrderLines.OrderYear AND Supp.OrderSequence = OrderLines.OrderSequence AND Supp.OrderLineSequence= OrderLines.Sequence)
    WHERE OrderLines.Reference LIKE '%11301%'
) a
WHERE R2 >= (1 + 0) AND R2 < (1 + 20)


union all


SELECT 
    *
FROM
(
    SELECT 
        *,                                          
        DENSE_RANK() OVER (ORDER BY cmd.OrderYear, cmd.OrderSequence) R2
    FROM 
    (
        SELECT 
            Project1.*
         FROM 
         ( 
            SELECT Extent1.*
                FROM  
                    [WS].[viewOrderDetail] AS [Extent1]  
                WHERE 
                    [Extent1].CustomerID IN (2,7,8,9)    
           )  AS [Project1]
    ) AS [Cmd]  
    LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Year=[cmd].OrderYear AND [orders].[Sequence]=[cmd].OrderSequence)
    LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].[OrderYear] = [Cmd].[OrderYear] AND OrderLines.OrderSequence = Cmd.OrderSequence )
    LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp]  ON (Supp.OrderYear = OrderLines.OrderYear AND Supp.OrderSequence = OrderLines.OrderSequence AND Supp.OrderLineSequence= OrderLines.Sequence)
    WHERE CAST(OrderLines.OrderYear as varchar(4)) +'.'+ right('000000' + CAST(OrderLines.OrderSequence as varchar(6)),6)+'.'+right('000'+cast(OrderLines.Sequence as varchar(3)),3) LIKE '%11301%'    
) a
WHERE R2 >= (1 + 0) AND R2 < (1 + 20)
ORDER BY a.DeliveryDate DESC

我真的需要减少执行该查询的时间。有任何想法吗 ?

1 个答案:

答案 0 :(得分:0)

尝试使用以下查询..我刚修改了您的查询,无法测试它,因为我没有详细的架构信息。

;WITH cte_1
AS
(SELECT Extent1.*, DENSE_RANK() OVER (ORDER BY [Extent1].OrderYear
        ,[Extent1].OrderSequence) R2
 FROM   [WS].[viewOrderDetail] AS [Extent1]  
 WHERE  [Extent1].CustomerID IN (2,7,8,9) 
    AND CAST([Extent1].OrderYear as varchar(3)) +'.'+ right('000000' + CAST([Extent1].OrderSequence as varchar(6)),6) LIKE '%11301%')  

, cte_2
 AS
  (SELECT Extent1.*, DENSE_RANK() OVER (ORDER BY [Extent1].OrderYear
         , [Extent1].OrderSequence) R2
   FROM   [WS].[viewOrderDetail] AS [Extent1]  
     LEFT JOIN [WS].[viewOrders] AS [orders] 
        ON ([orders].Year=[Extent1].OrderYear AND [orders].[Sequence]=[Extent1].OrderSequence)
  WHERE  [Extent1].CustomerID IN (2,7,8,9) 
    AND Orders.Reference LIKE '%11301%')   

, cte_3
  AS
  (SELECT Extent1.*, DENSE_RANK() OVER (ORDER BY [Extent1].OrderYear
         , [Extent1].OrderSequence) R2
   FROM   [WS].[viewOrderDetail] AS [Extent1]  
     LEFT JOIN [WS].[viewOrders] AS [orders] 
        ON ([orders].Year=[Extent1].OrderYear AND [orders].[Sequence]=[Extent1].OrderSequence)
      LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] 
        ON ([OrderLines].[OrderYear] = [Extent1].[OrderYear] AND OrderLines.OrderSequence = [Extent1].OrderSequence )
  WHERE  [Extent1].CustomerID IN (2,7,8,9) 
           AND OrderLines.Reference LIKE '%11301%')
, cte_4
AS
  (SELECT Extent1.*, DENSE_RANK() OVER (ORDER BY [Extent1].OrderYear
          , [Extent1].OrderSequence) R2
   FROM   [WS].[viewOrderDetail] AS [Extent1]  
      LEFT JOIN [WS].[viewOrders] AS [orders] 
        ON ([orders].Year=[Extent1].OrderYear AND [orders].[Sequence]=[Extent1].OrderSequence)
      LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] 
        ON ([OrderLines].[OrderYear] = [Extent1].[OrderYear] AND OrderLines.OrderSequence = [Extent1].OrderSequence )
      LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp]  
        ON (Supp.OrderYear = OrderLines.OrderYear AND Supp.OrderSequence = OrderLines.OrderSequence AND Supp.OrderLineSequence= OrderLines.Sequence)
  WHERE  [Extent1].CustomerID IN (2,7,8,9) 
    AND CAST(OrderLines.OrderYear as varchar(4)) +'.'+ right('000000' + CAST(OrderLines.OrderSequence as varchar(6)),6)+'.'+right('000'+cast(OrderLines.Sequence as varchar(3)),3) LIKE '%11301%')    

SELECT  *
FROM cte_1 a
WHERE a.R2 >= (1 + 0) AND a.R2 < (1 + 20)
UNION ALL
SELECT  *
FROM cte_2 a
WHERE a.R2 >= (1 + 0) AND a.R2 < (1 + 20)
UNION ALL
SELECT  *
FROM cte_3 a
WHERE a.R2 >= (1 + 0) AND a.R2 < (1 + 20)
UNION ALL
SELECT  *
FROM cte_4 a
WHERE a.R2 >= (1 + 0) AND a.R2 < (1 + 20)
ORDER BY a.DeliveryDate DESC