1. 程式人生 > >一個SQL語句的優化(sqlserver)

一個SQL語句的優化(sqlserver)

性能 HERE lse union ont sele cit The 原因

最早的寫法:

WITH T AS
(SELECT case when Col1 IS NULL OR Col1=N‘‘ then Col2 else Col1 end as Code,case when Col1 IS NULL OR Col1=N‘‘ then 1 else 0 end as Flag FROM YM  WHERE Col_076 BETWEEN 2018-07-25 AND 2018-08-03 AND Col_478=Nxx AND Col_346 LIKE N%dd%),
D AS (SELECT Code,province,city  FROM Adds)
SELECT province AS 省,city as 市,COUNT(1) 票數 FROM (SELECT A.DR_250 as province,A.DR_251 as city FROM T INNER JOIN TB AS A ON A.DR_203=T.Code WHERE T.Flag=0 UNION ALL SELECT D.province,D.city FROM T INNER JOIN D ON D.Code=T.Code WHERE T.Flag=1 UNION ALL SELECT ‘‘ AS province,‘‘ AS city FROM T WHERE
Code IS NULL OR Code=N‘‘) AS S GROUP BY province,city;

最新的寫法:

SELECT case when Col1 IS NULL OR Col1=N‘‘ then Col2 else Col1 end as Code,case when Col1 IS NULL OR Col1=N‘‘ then 1 else 0 end as Flag into #T FROM YM WHERE Col_076 BETWEEN 2018-07-25 AND 2018-08-03 AND Col_478=Nxx AND Col_346 LIKE
N%dd%; SELECT Code,province,city into #D FROM Adds; SELECT province AS 省,city as 市,COUNT(1) 票數 FROM (SELECT A.DR_250 as province,A.DR_251 as city FROM #T INNER JOIN TB AS A ON A.DR_203=#T.Code WHERE #T.Flag=0 UNION ALL SELECT #D.province,#D.city FROM #T INNER JOIN #D ON #D.Code=#T.Code WHERE #T.Flag=1 UNION ALL SELECT ‘‘ AS province,‘‘ AS city FROM #T WHERE Code IS NULL OR Code=N‘‘) AS S GROUP BY province,city; DROP table #T; DROP table #D;

新的寫法比原始寫法性能高出太多(原語句執行會超時),最大的原因是對with語句理解有誤!!!

一個SQL語句的優化(sqlserver)