星期六, 8月 04, 2018

[SQL] UNION ALL 發生隱含轉換

利用 DMV 語法找到下述 TSQL 有隱含轉換存在
SELECT
  ........................
FROM rddwgbom AS w
  JOIN vwmtdata AS m ON w.modelcode = m.mtcode
WHERE
  ........................
  AND m.hide = 0
[SQL] 避免隱含轉換-1

因為 Hide 欄位資料型態是 bit,想說把 0 改為 CAST(0 as bit) 就可以結案,沒想到執行計畫竟然還是有隱含轉換
SELECT
  ........................
FROM rddwgbom AS w
  JOIN vwmtdata AS m ON w.modelcode = m.mtcode
WHERE
  ........................
  AND m.hide = CAST(0 AS bit)
最後發現是 View 內老早就隱含轉換了,Orz
SELECT
  .................. ,
  m.hide -- Table 內真實存在欄位,資料型態為 bit
FROM mtdata AS m
  LEFT JOIN MTSETPRICE AS p ON m.mtCode = p.mtcode
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM salesmtdata
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM salesspec
UNION ALL
SELECT
  .................. , 
  0 -- 配合 UNION ALL 的虛擬欄位
FROM RDDESIGNCHG
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM pmsetorder
WHERE
  ..................
資料類型優先順序 文章內就可以查到,int 優先權是高於 bit,所以 View 內的 Hide 欄位就被轉為 int 了,把 View 內的 0 通通改為 CAST(0 as bit),執行計畫中隱含轉換字樣終於消失了

[SQL] 避免隱含轉換-2

以前看見的網路文章都是在 WHERE 條件內,判斷等於時出現的,沒想到 UNION ALL 也會存在隱含轉換

沒有留言:

張貼留言