SQL Server-2008:嵌套选择,需要提高执行速度吗?

时间:2018-11-13 02:44:30

标签: sql sql-server performance sql-server-2008

问题出在这里:

  • 首先我有一个嵌套查询,为此,我需要缩短执行时间并使其更快。想象一下,第一次时47秒,第二次是46/45秒。第二个是通过缓存运行的(第二个执行总是比第一次更快,但不是这样)。

  • 第二,该查询在每个子选择中使用SUMCASTCASE。不能躲闪

  • 第三我使用OPTION(FAST 500)从互联网上阅读了另一种解决方案。

这里是示例:

SELECT [cutomerSection],
       SUM(DEBIT) AS DEBIT,
       SUM(CREDIT) AS CREDIT,
       SUM([OTHERS]) AS 'OTHERS'
FROM
    (-- SECTOR A
     SELECT cb.paymentGrp AS 'cutomerSection',
         CASE
           WHEN j.paymentStat = 'DEBIT' THEN SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*d.adm/100, 0) AS INT)) + SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*(d.fee-d.adm)/100, 0) AS INT))
           ELSE 0
       END AS 'DEBIT',
       CASE
           WHEN j.paymentStat = 'CREDIT' THEN SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*d.adm/100, 0) AS INT)) + SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*(d.fee-d.adm)/100, 0) AS INT))
           ELSE 0
       END AS 'CREDIT',
       CASE
           WHEN (j.paymentStat = ''
                 OR j.paymentStat IS NULL) THEN SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*d.adm/100, 0) AS INT)) + SUM(CAST(ISNULL(isnull(qty, 1)*(100-disc)*(d.fee-d.adm)/100, 0) AS INT))
           ELSE 0
       END AS 'OTHERS'
   FROM tbactDetail d WITH(NOLOCK)
   LEFT JOIN tbsectorSection j WITH(NOLOCK) ON d.tranCode = j.tranCode
   LEFT JOIN tbact t ON (d.actCode=t.actCode
                         AND t.sectorCode = j.sectorCode)
   LEFT JOIN tbCustomer c WITH(NOLOCK) ON c.custCode=j.custCode
   LEFT JOIN tbfrontDesk a WITH(NOLOCK) ON a.struckNo=j.struk
   LEFT JOIN tbpaymentList cb WITH(NOLOCK) ON cb.paymentK = a.paymentK
   LEFT JOIN tbleading dc ON dc.leadCode = j.leadCode
   LEFT JOIN tbsector p ON j.sectorCode = p.sectorCode
   WHERE (j.deleted IS NULL
          OR j.deleted = 0)
     AND a.status = 'FINISH'
     AND (j.tranDate BETWEEN '2018-11-01 00:00:00' AND '2018-11-01 23:59:59')
   GROUP BY cb.paymentGrp,
            j.paymentStat
   UNION ALL -- SECTOR PARK
SELECT cb.paymentGrp AS 'cutomerSection',
       CASE
           WHEN t.paymentStat = 'DEBIT' THEN SUM(CAST(isnull(d.rate*d.qty*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'DEBIT',
       CASE
           WHEN t.paymentStat = 'CREDIT' THEN SUM(CAST(isnull(d.rate*d.qty*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'CREDIT',
       CASE
           WHEN (t.paymentStat = ''
                 OR t.paymentStat IS NULL) THEN SUM(CAST(isnull(d.rate*d.qty*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'OTHERS'
   FROM tbparkDetail d
   LEFT JOIN tbTranPark t ON d.tranCode = t.tranCode
   JOIN tbsectorSection j ON t.strukPoli = j.struk
   LEFT JOIN tbCustomer c WITH(NOLOCK) ON c.custCode=j.custCode
   LEFT JOIN tbfrontDesk a WITH(NOLOCK) ON a.struckNo=j.struk
   JOIN tbpaymentList cb ON a.paymentK = cb.paymentK
   LEFT JOIN tbleading dc ON dc.leadCode=j.leadCode
   LEFT JOIN tbsector p ON j.sectorCode=p.sectorCode
   WHERE (j.deleted IS NULL
          OR j.deleted=0)
     AND (t.strukPoli IS NOT NULL
          OR t.strukPoli <> ''
          OR t.strukPoli <> '--')
     AND a.status = 'FINISH'
     AND (j.tranDate BETWEEN '2018-11-01 00:00:00' AND '2018-11-01 23:59:59')
   GROUP BY cb.paymentGrp,
            t.paymentStat
   UNION ALL -- SECTOR FRONT
SELECT cb.paymentGrp AS 'cutomerSection',
       CASE
           WHEN t.paymentStat = 'DEBIT' THEN SUM(CAST(isnull(d.rate*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'DEBIT',
       CASE
           WHEN t.paymentStat = 'CREDIT' THEN SUM(CAST(isnull(d.rate*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'CREDIT',
       CASE
           WHEN (t.paymentStat = ''
                 OR t.paymentStat IS NULL) THEN SUM(CAST(isnull(d.rate*(100-disc)/100, 0) AS INT))
           ELSE 0
       END AS 'OTHERS'
   FROM tbDetailRadioterapi d
   LEFT JOIN tbtranFront t ON d.tranCode = t.tranCode
   LEFT JOIN tbsectorSection j ON t.strukPoli = j.struk
   LEFT JOIN tbCustomer c WITH(NOLOCK) ON c.custCode=j.custCode
   LEFT JOIN tbfrontDesk a WITH(NOLOCK) ON a.struckNo = j.struk
   LEFT JOIN tbpaymentList cb ON a.paymentK = cb.paymentK
   LEFT JOIN tbleading dc ON dc.leadCode=j.leadCode
   LEFT JOIN tbsector p ON j.sectorCode=p.sectorCode
   WHERE (t.deleted IS NULL
          OR t.deleted=0)
     AND (strukPoli IS NOT NULL
          OR strukPoli <>''
          OR strukPoli <>'--')
     AND a.status='FINISH'
     AND (j.tranDate BETWEEN '2018-11-01 00:00:00' AND '2018-11-01 23:59:59')
   GROUP BY cb.paymentGrp,
            t.paymentStat) AS a
GROUP BY [cutomerSection]

第三次使用选项(快速500),我不知道为什么,但总是出错:

  

OPTION附近的错误语法

PS:对不起,我的英语不好

0 个答案:

没有答案