資料型別隱式轉換導致的阻塞
背景
不合適的資料型別隱式轉換會導致效能下降和併發下降,而且大多數技術人員對隱式轉換的概念是陌生的,因此在生產環境中非常常見,透過本文做一個系統的梳理。
現象
SQL語句是很簡單的一個MERGE語句,基於表的主鍵 PK_NAME進行匹配,匹配到做更新,匹配不到做插入。
DECLARE @PK_NAME nvarchar( 4000), @PK_VALUE nvarchar( 4000)
MERGE INTO
COIND_DS t
USING
(
SELECT @PK_NAME AS PK_NAME, @PK_VALUE AS PK_VALUE
) b
ON
(
t.PK_NAME = b.PK_NAME
)
WHEN MATCHED THEN
UPDATE SET PK_VALUE = @PK_VALUE
WHEN NOT MATCHED THEN
INSERT (PK_NAME, PK_VALUE) VALUES(@PK_NAME, @PK_VALUE);
分析
SQL Server官方文件中提供了一張資料型別轉換表,詳細的描述了各資料型別之間的轉換關係,詳細請參考:。
DEMO
說明1:這裡用LIKE來做演示是因為執行計劃簡單,容易理解。現實中大多數情況還是等值比較,因為SQL Server做了相關的最佳化,把nchar型別的值計算為char型別的最小值和最大值,然後進行範圍的查詢,再對查詢出來的結果進行隱式轉換後比較,因此是不會導致索引掃描的,效能下降的不是特別厲害,但是由於變成了範圍查詢,加鎖的行數增加了,還是會導致併發下降。
解決
在設計 欄位型別 和宣告參 數時 不要 隨 意 , 最典型 的錯 誤就 是 在S QL語 句中聲 明 字 符 串 引數 時不管什麼 用途一 律使用n varchar型別 。
在程式中指明資料型別,例如在C#中不明確指定資料型別的字串引數,就會使用nvarchar資料型別。
想要生成varchar資料型別,一定要明確指定。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023658/viewspace-2929132/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle隱式型別轉換導致索引失效Oracle型別索引
- 資料型別的隱式轉換資料型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- ORACLE中的隱式資料型別轉換(一)Oracle資料型別
- 【隱式轉換】注意隱式轉換將導致索引無法使用索引
- oracle資料型別隱式轉換----- 應急方案Oracle資料型別
- JavaScript隱式型別轉換JavaScript型別
- MySQL 隱式型別轉換MySql型別
- javascript資料型別隱式和顯式轉換詳解JavaScript資料型別
- 欄位的資料型別隱式轉換有關係資料型別
- javascript 隱式資料型別轉換程式碼例項JavaScript資料型別
- C++隱式型別的轉換C++型別
- 有趣的JavaScript隱式型別轉換JavaScript型別
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- C語言中,四則運算導致資料型別的轉換C語言資料型別
- 高效的SQL(隱式轉換導致不走索引)SQL索引
- C語言的隱式型別轉換C語言型別
- JavaScript的隱式型別轉換淺析JavaScript型別
- C# 隱式型別轉換(轉載)C#型別
- 關於隱式資料型別轉換的一些試驗資料型別
- 如何實現隱式型別轉換型別
- 談談 MySQL 隱式型別轉換MySql型別
- C++隱式類型別轉換C++型別
- C++ 隱式類型別轉換C++型別
- 索引失效系列——隱式型別轉換索引型別
- JavaScript隱式型別轉換趣解JavaScript型別
- c++隱式型別轉換存在的陷阱C++型別
- 「譯」JavaScript 的怪癖 1:隱式型別轉換JavaScript型別
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- 建構函式定義的隱式型別轉換函式型別
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- 資料型別,型別轉換資料型別
- 徹底理解c++的隱式型別轉換C++型別
- 資料型別的轉換資料型別
- sql server 資料型別轉換函式SQLServer資料型別函式
- Sql Server 資料型別 轉換 函式SQLServer資料型別函式
- Sql Server資料型別轉換函式SQLServer資料型別函式