SQL Server execution plan with convert implicit 2

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值