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:
- user-defined data types (highest)
- sql_variant
- xml
- datetimeoffset
- datetime2
- datetime
- smalldatetime
- date
- time
- float
- real
- decimal
- money
- smallmoney
- bigint
- int
- smallint
- tinyint
- bit
- ntext
- text
- image
- timestamp
- uniqueidentifier
- nvarchar (including nvarchar(max) )
- nchar
- varchar (including varchar(max) )
- char
- varbinary (including varbinary(max) )
- binary (lowest)
沒有留言:
張貼留言