資料型別隱式轉換導致的阻塞
背景
不合適的資料型別隱式轉換會導致效能下降和併發下降,而且大多數技術人員對隱式轉換的概念是陌生的,因此在生產環境中非常常見,透過本文做一個系統的梳理。
現象
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 隱式資料型別轉換JavaScript資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- JavaScript隱式型別轉換JavaScript型別
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- C語言中,四則運算導致資料型別的轉換C語言資料型別
- C語言的隱式型別轉換C語言型別
- 如何實現隱式型別轉換型別
- c++隱式型別轉換存在的陷阱C++型別
- 建構函式定義的隱式型別轉換函式型別
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- 資料型別,型別轉換資料型別
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- 徹底理解c++的隱式型別轉換C++型別
- sql server 資料型別轉換函式SQLServer資料型別函式
- 資料型別轉換資料型別
- JS資料型別的轉換JS資料型別
- 相容模式下導致數值型別發生隱式轉換,SQL在生產上無法正常使用案例模式型別SQL
- Java資料型別及型別轉換Java資料型別
- JavaScript 資料型別轉換JavaScript資料型別
- javascript資料型別轉換JavaScript資料型別
- 【Java】資料型別轉換Java資料型別
- 資料型別及轉換資料型別
- 3. php資料型別、資料型別轉換PHP資料型別
- javascript中隱私型別轉換JavaScript型別
- oracle資料隱式轉換規則Oracle
- JS裡的資料型別轉換JS資料型別
- JS 裡的資料型別轉換JS資料型別
- golang 快速入門 [8.4]-常量與隱式型別轉換Golang型別
- '2'>'10'==true? JS是如何進行隱式型別轉換的?JS型別
- 從兩個小例子看js中的隱式型別轉換JS型別
- JS中資料型別轉換JS資料型別
- 2、java資料型別轉換Java資料型別
- JavaScript 基本資料型別轉換JavaScript資料型別
- js資料型別間的互相轉換JS資料型別
- 前端面試官必問系列之隱式型別轉換前端面試型別
- scala和java資料型別轉換Java資料型別
- go語言資料型別轉換Go資料型別
- Python3 資料型別轉換Python資料型別