SQL Server execution plan with convert implicit 2

版权声明:複製請註明來源 https://blog.csdn.net/weixin_39392627/article/details/87918304

env: Windows Server 2016

        SQL Server 2016 SP2

 

這次一樣遇到隱含轉換的問題,與上次比較不同是:

上次是variable table宣告的欄位資料型態造成,這次就是實體Table造成。

這次遇到的問題除了隱含轉換,還有CPU使用的問題。

這次最大的表有近20億筆。在同一台server跨DB join 4張表。

 

1.調整前執行

訊息:

Type conversion in expression ([XXXX].[dbo].[XXXX].[XXXX]=CONVERT(nvarchar(512),[XXXX].[dbo].[XXXX].[XXXX],0)) may affect "SeekPlan" in query plan choice, Type conversion in expression ([XXXX].[dbo].[XXXX].[XXXX]=CONVERT(nvarchar(512),[XXXX].[dbo].[XXXX].[XXXX],0)) may affect "SeekPlan" in query plan choice

 

雖然查詢的語法有使用MAXDOP=4,但是可以發現過程中也耗損不少CPU

 

2.調整表的欄位資料型態,將VARCHAR改為NVARCHAR

command:

ALTER TABLE dbo.TESTTB01 ALTER COLUMN Token NVARCHAR(512) NULL
GO
ALTER TABLE dbo.TESTTB02 ALTER COLUMN Token NVARCHAR(512) NULL
GO

3.再次執行語法

我們只執行select部分,將insert into語句移除。

 

我們可以發現調整後CPU不再需要大量去做型別轉換。只是有個疑問,執行時間稍微拉長?

但是使用者還可以接受

 

4.從以下官網得知資料型態優先順序

Data type precedence (Transact-SQL)

NVARCHAR優先順序高於VARCHAR,所以VARCHAR會轉會為NVARCHAR。

另外個人覺得還可以優化的部分是nvarchar(512),裡面放的資料不到nvarchar(100)。

 

SQL Server uses the following precedence order for data types:

  1. user-defined data types (highest)
  2. sql_variant
  3. xml
  4. datetimeoffset
  5. datetime2
  6. datetime
  7. smalldatetime
  8. date
  9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar (including nvarchar(max) )
  26. nchar
  27. varchar (including varchar(max) )
  28. char
  29. varbinary (including varbinary(max) )
  30. binary (lowest)

 

猜你喜欢

转载自blog.csdn.net/weixin_39392627/article/details/87918304