2013-06-25 72 views
1

我的查询有这样的结构:需要加快此SQL查询

SELECT DISTINCT (CO.CateringOrderId), 
       CO.CateringOrderNumber, 
       MC.FirstName + ' ' + MC.LastName AS "CustomerName", 
       CO.EventDate AS EventDate, 
       CO.IsCompleted, 
       CO.IsVerified, 
       MC.EmailId, 
       CAT.OfficePhone, 
       CAT.Mobile, 
       CAT.Fax, 
       CO.TotalInvoiceAmount, 
       CO.BarterCharityId, 
       (SELECT Sum (Amount) 
       FROM Catering_Order_Payment_Trans 
       WHERE CateringOrderId = CO.CateringOrderId) AS AmountReceived 
FROM Catering_Orders CO, 
     Master_Customer MC, 
     Customer_Address_Trans CAT, 
     Catering_Order_Employee_Trans COET 
WHERE MC.CompanyId = @p_CompanyId 
    AND (MC.CustomerId = @p_CustomerId OR @p_CustomerId = -1) 
    AND (CO.CateringOrderNumber LIKE '%' + @p_CateringOrderNumber + '%') 
    AND (CO.EventDate >= CONVERT (DATETIME, @p_FromDate) OR @p_FromDate = '') 
    AND (CO.EventDate <= CONVERT (DATETIME, @p_ToDate) OR @p_ToDate = '') 
    AND (CO.IsCompleted = @p_IsCompleted OR @p_IsCompleted = -1) 
    AND (COET.EmployeeId = @p_CatererId OR @p_CatererId = -1) 
    AND MC.CustomerId = CO.CustomerId 
    AND MC.PersonalAddressId = CAT.CustomerAddressId 
    AND (COET.CateringOrderId = CO.CateringOrderId 
     OR CO.CateringOrderId NOT IN 
      (SELECT CateringOrderId FROM Catering_Order_Employee_Trans)) 
    AND (CAT.Mobile like '%' + @p_ContactNumber + '%') 
    AND (CO.IsActive is null or CO.IsActive=1) 
ORDER BY CO.CateringOrderId DESC 

我觉得SUM子查询减缓它。请告诉我如何加快速度。 目前它的执行时间约为7-10秒。

+0

什么是执行计划是什么样子? SQL Server应该能够将该查询解联到左外部联接。 –

+0

请提供您的查询的完整示例。 – Devart

+0

@Devart我已经更新了这个问题 – Lakshay

回答

1

尝试这样的 -

SELECT DISTINCT 
    CO.CateringOrderId, 
    CO.CateringOrderNumber, 
    MC.FirstName + ' ' + MC.LastName AS CustomerName, 
    CO.EventDate AS EventDate, 
    CO.IsCompleted, 
    CO.IsVerified, 
    MC.EmailId, 
    CAT.OfficePhone, 
    CAT.Mobile, 
    CAT.Fax, 
    CO.TotalInvoiceAmount, 
    CO.BarterCharityId, 
    AmountReceived = (
     SELECT SUM(t.Amount) 
     FROM dbo.Catering_Order_Payment_Trans t 
     WHERE t.CateringOrderId = CO.CateringOrderId 
    ) 
FROM (
    SELECT * 
    FROM dbo.Catering_Orders 
    WHERE ISNULL(IsActive, 1) = 1 
     AND (IsCompleted = @p_IsCompleted OR @p_IsCompleted = -1) 
     AND CateringOrderNumber LIKE '%' + @p_CateringOrderNumber + '%' 
     AND EventDate BETWEEN 
      CONVERT(DATETIME, ISNULL(NULLIF(@p_FromDate, ''), '18000101')) 
      AND 
      CONVERT(DATETIME, ISNULL(NULLIF(@p_ToDate, ''), '30000101')) 
) CO 
JOIN dbo.Master_Customer MC ON MC.CustomerId = CO.CustomerId 
JOIN dbo.Customer_Address_Trans CAT ON MC.PersonalAddressId = CAT.CustomerAddressId 
LEFT JOIN (
    SELECT * 
    FROM dbo.Catering_Order_Employee_Trans 
    WHERE EmployeeId = @p_CatererId 
     OR @p_CatererId = -1 
) COET ON COET.CateringOrderId = CO.CateringOrderId 
WHERE MC.CompanyId = @p_CompanyId 
    AND (MC.CustomerId = @p_CustomerId OR @p_CustomerId = -1) 
    AND CAT.Mobile LIKE '%' + @p_ContactNumber + '%' 

AND (COET.CateringOrderId = CO.CateringOrderId 
     OR CO.CateringOrderId NOT IN 
      (SELECT CateringOrderId FROM Catering_Order_Employee_Trans)) 

(SELECT Sum (Amount) 
       FROM Catering_Order_Payment_Trans 
       WHERE CateringOrderId = CO.CateringOrderId) AS AmountReceived 
+0

谢谢!它现在像火箭一样工作! :) – Lakshay

+0

不客气@Lakshay。 – Devart

0

要优化查询,您应该编辑OR条件中插入和查询真正减慢条件

AND ( CO.EventDate <= CONVERT (DATETIME, @p_ToDate) 
     OR @p_ToDate = '') 

应该成为像

AND ( CO.EventDate <= CASE WHEN @p_ToDate = '' THEN 
         GETDATE() 
        ELSE 
         CONVERT (DATETIME,@p_ToDate) 
        END) 

也可以尝试通过一个删除一个innested选择两个在选择和在哪里看哪一个最慢的查询

+0

谢谢..我可以用SUM子查询做什么? – Lakshay

+0

您可以在连接中添加该表,在select中您将直接执行总和,然后将group by子句与其他列相加 – Aleeeeee

1

主要问题尝试:

SELECT CO.CateringOrderId, 
     CO.CateringOrderNumber, 
     MC.FirstName + ' ' + MC.LastName AS "CustomerName", 
     CO.EventDate AS EventDate, 
     CO.IsCompleted, 
     CO.IsVerified, 
     MC.EmailId, 
     CAT.OfficePhone, 
     CAT.Mobile, 
     CAT.Fax, 
     CO.TotalInvoiceAmount, 
     CO.BarterCharityId, 
     COPT.AmountReceived 
FROM Catering_Orders CO 
JOIN Master_Customer MC ON MC.CustomerId = CO.CustomerId 
JOIN Customer_Address_Trans CAT ON MC.PersonalAddressId = CAT.CustomerAddressId 
LEFT JOIN (SELECT CateringOrderId, Sum(Amount) AS AmountReceived 
      FROM Catering_Order_Payment_Trans 
      GROUP BY CateringOrderId) COPT 
    ON COPT.CateringOrderId = CO.CateringOrderId 
WHERE MC.CompanyId = @p_CompanyId 
    AND (MC.CustomerId = @p_CustomerId OR @p_CustomerId = -1) 
    AND (CO.CateringOrderNumber LIKE '%' + @p_CateringOrderNumber + '%') 
    AND (CO.EventDate >= CONVERT (DATETIME, @p_FromDate) OR @p_FromDate = '') 
    AND (CO.EventDate <= CONVERT (DATETIME, @p_ToDate) OR @p_ToDate = '') 
    AND (CO.IsCompleted = @p_IsCompleted OR @p_IsCompleted = -1) 
    AND EXISTS 
     (SELECT NULL 
     FROM Catering_Order_Employee_Trans COET 
     WHERE COET.CateringOrderId = CO.CateringOrderId AND 
      (COET.EmployeeId = @p_CatererId OR @p_CatererId = -1)) 
    AND (CAT.Mobile like '%' + @p_ContactNumber + '%') 
    AND (CO.IsActive is null or CO.IsActive=1) 
ORDER BY CO.CateringOrderId DESC