亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

曲演雜壇--隱式轉換

2024-07-21 02:50:38
字體:
來源:轉載
供稿:網友
曲演雜壇--隱式轉換

--==================================================================MSDN如下說:當兩個不同數據類型的表達式用運算符組合后,數據類型優先級規則指定將優先級較低的數據類型轉換為優先級較高的數據類型。 如果此轉換不是所支持的隱式轉換,則返回錯誤。 當兩個操作數表達式具有相同的數據類型時,運算的結果便為該數據類型。--==================================================================

在數據庫操作中,類型轉換時無可避免的情況,但是“偷偷摸摸”進行的隱式轉換就要引起管理員的高度重視,當隱身轉換發生在過濾條件中的列上或者表連接的列上時,可能會導致無法使用索引而造成性能問題。

測試code

USE TestDemoGODROP TABLE TB1--============================================--創建測試表CREATE TABLE TB1(    ID INT IDENTITY(1,1) PRIMARY KEY,    C1 VARCHAR(200),    C2 VARCHAR(200))CREATE INDEX IX_C1 ON TB1(C1)--插入測試數據INSERT TB1(C1,C2)SELECT T.name,T.name FROM sys.all_columns TGO 10--執行查詢EXEC SP_Executesql N'SELECT * FROM TB1WHERE C1 =@C1',N'@C1 VARCHAR(200)',@C1='C1'EXEC SP_Executesql N'SELECT * FROM TB1WHERE C1 =@C1',N'@C1 NVARCHAR(200)',@C1='C1'

對比兩個執行計劃,會發現兩者的執行計劃有很大區別,后者傳入NVARCHAR(200)類型的參數,導致執行計劃中出現隱式轉換:

注意:上圖中,因為隱式轉換,將等值運算符變成了區間查詢。

請原諒我給你們一個不好的Demo,即使在過濾條件的數據列上發生了執行計劃,依然有可能使用到索引。

PS:在我的本地測試機上,發生隱式轉換的執行計劃開銷要遠低于沒發生隱式轉換的,發生隱式轉換的執行計劃產生的邏輯讀也小于沒發生隱式轉換的,對此問題,我也很糾結,請別問。

盡管有上面的示例作為發面教材,我仍堅定地建議:請避免在過濾條件中的列上或者表連接的列上發生隱式轉換,如果可以,我們甚至需要避免對傳入參數進行隱式轉換。

對于隱式轉換,我們可以通過執行計劃xml來查找

查找版本1:

-- =============================================-- Author:    SQL SERVER DMVS IN ACTION-- Create date: 2013-04-04-- Description:    查找有以下問題的查詢-- 1. 缺失索引-- 2. 列隱式轉換-- 3. 表掃描-- 4. 缺失統計-- =============================================CREATE PROCEDURE  [dbo].[usp_GetTop20MostFrequentlyExecutedAndTroubledQueries]ASBEGINSET NOCOUNT ON;SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT TOP 100 qs.execution_count AS ExecutionCount,CAST((qs.total_worker_time)/ 1000.0 AS DECIMAL(28,2)) AS TotalMilliSecondsForCPUTime,CAST((qs.total_worker_time)/ 1000.0 / qs.execution_count AS DECIMAL(28, 2)) AS AvgMilliSecondsForCPUTime,CAST((qs.total_elapsed_time- qs.total_worker_time) / 1000.0 AS DECIMAL(28,2)) AS BlockedTotalMilliSeconds,CAST((qs.total_elapsed_time  - qs.total_worker_time) / 1000.0 / qs.execution_count AS DECIMAL(28, 2)) AS AverageBlockingMilliSeconds,(qs.total_logical_reads + qs.total_logical_writes) AS TotalIO,(qs.total_logical_reads+ qs.total_logical_writes) / qs.execution_count AS AvgIO,qs.total_physical_reads,qs.total_logical_reads,qs.total_logical_reads/execution_count AS avg_logical_reads,qs.total_logical_writes,qs.total_logical_writes/execution_count AS avg_logical_writes,qs.last_execution_time,SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1,    ((CASE WHEN qs.statement_end_offset = -1    THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2    ELSE qs.statement_end_offset    END - qs.statement_start_offset)/2) + 1) AS IndividualQuery, qt.text AS ParentQuery, DB_NAME(qt.dbid) AS DatabaseName, qp.query_planFROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qtCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qpWHERE QS.execution_count>10AND (qs.total_logical_reads+ qs.total_logical_writes) / qs.execution_count>100AND(CAST(qp.query_plan AS NVARCHAR(MAX)) LIKE '%<ColumnsWithNoStatistics>%'  OR CAST(qp.query_plan AS NVARCHAR(MAX)) LIKE '%<MissingIndexes>%' OR CAST(qp.query_plan AS NVARCHAR(MAX)) LIKE '%CONVERT_IMPLICIT%' OR CAST(qp.query_plan AS NVARCHAR(MAX)) LIKE '%<TableScan%')                 ORDER BY QS.execution_count DESCEND

查找版本2:

--====================================================================--查看指定數據庫下發生的隱式轉換--來源:http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/08/finding-implicit-column-conversions-in-the-plan-cache.aspxSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED DECLARE @dbname SYSNAME SET @dbname = QUOTENAME(DB_NAME()); WITH XMLNAMESPACES    (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') SELECT    stmt.value('(@StatementText)[1]', 'varchar(max)') AS SQL_Text,    t.value('(ScalarOperator/Identifier/ColumnReference/@Schema)[1]', 'varchar(128)') AS SchemaName,    t.value('(ScalarOperator/Identifier/ColumnReference/@Table)[1]', 'varchar(128)') AS TableName,    t.value('(ScalarOperator/Identifier/ColumnReference/@Column)[1]', 'varchar(128)') AS ColumnName,    ic.DATA_TYPE AS ConvertFrom,    ic.CHARACTER_MAXIMUM_LENGTH AS ConvertFromLength,    t.value('(@DataType)[1]', 'varchar(128)') AS ConvertTo,    t.value('(@Length)[1]', 'int') AS ConvertToLength,    query_plan FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS batch(stmt) CROSS APPLY stmt.nodes('.//Convert[@Implicit="1"]') AS n(t) JOIN INFORMATION_SCHEMA.COLUMNS AS ic    ON QUOTENAME(ic.TABLE_SCHEMA) = t.value('(ScalarOperator/Identifier/ColumnReference/@Schema)[1]', 'varchar(128)')    AND QUOTENAME(ic.TABLE_NAME) = t.value('(ScalarOperator/Identifier/ColumnReference/@Table)[1]', 'varchar(128)')    AND ic.COLUMN_NAME = t.value('(ScalarOperator/Identifier/ColumnReference/@Column)[1]', 'varchar(128)') WHERE t.exist('ScalarOperator/Identifier/ColumnReference[@Database=sql:variable("@dbname")][@Schema!="[sys]"]') = 1

PS:

1.在生產服務器上,在varchar和nvarchar間發生隱式轉換,導致全表掃描,服務器擦點掛掉。

2.在不同服務器上,數據庫結構和數據相同,對于相同的語句生成兩個性能差距巨大的執行計劃。

--===================================================

參考鏈接:Finding Implicit Column Conversions in the Plan Cache:http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/08/finding-implicit-column-conversions-in-the-plan-cache.aspx

數據類型優先級:http://msdn.microsoft.com/zh-cn/library/ms190309.aspx

數據類型轉換:http://msdn.microsoft.com/zh-cn/library/ms191530.aspx

--====================================================

--妹子引狼


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人精品xxx一区| 亚洲天堂av在线免费| 性欧美在线看片a免费观看| 精品视频9999| 日韩av在线免费观看一区| 国产精品久久一区| 7777免费精品视频| 成人在线激情视频| 日韩精品欧美激情| 97视频com| 日本一区二区在线免费播放| 国产色视频一区| 国产成人福利网站| 高清欧美一区二区三区| 国产精品aaaa| 国产视频久久久久久久| www欧美xxxx| 97国产精品人人爽人人做| 欧美激情精品久久久久久蜜臀| 日韩av在线电影网| 欧美—级高清免费播放| 亚洲美女视频网| 日韩在线免费观看视频| 国产精品免费小视频| 一区二区三区久久精品| 免费不卡在线观看av| 日韩高清av在线| 欧美日韩免费在线观看| 最近免费中文字幕视频2019| 日韩av男人的天堂| 亚洲精品久久久久久下一站| 亚洲影院色在线观看免费| 久久99久久99精品免观看粉嫩| 一本色道久久88亚洲综合88| 26uuu国产精品视频| 国产精品一区二区久久国产| 日韩av在线一区二区| 国产97在线亚洲| 91爱视频在线| 国产精品嫩草影院久久久| 日韩亚洲成人av在线| 午夜剧场成人观在线视频免费观看| 欧美精品在线观看91| 最近2019年日本中文免费字幕| 国产成人a亚洲精品| 欧美极品欧美精品欧美视频| 青青在线视频一区二区三区| 日韩欧美在线免费| 久久激情五月丁香伊人| 在线一区二区日韩| 亚洲午夜精品久久久久久久久久久久| 亚洲小视频在线观看| 国产亚洲日本欧美韩国| 久久久久日韩精品久久久男男| 91系列在线播放| 成人午夜一级二级三级| 最新亚洲国产精品| 久久这里有精品视频| 欧美一级大片在线观看| 久久久午夜视频| 久久久久久久久亚洲| 欧美激情奇米色| 亚洲另类欧美自拍| 欧美视频在线免费| 欧美日韩在线观看视频| 成人黄色av网站| 中文字幕精品视频| 成人免费视频xnxx.com| 91成人天堂久久成人| 精品国产乱码久久久久久婷婷| 97视频色精品| 久久精品青青大伊人av| 欧洲精品毛片网站| 国产一区二区三区在线视频| 韩国精品久久久999| 国产精品久久久久久久久久小说| 国产精品揄拍500视频| 中文字幕不卡在线视频极品| 中文在线资源观看视频网站免费不卡| 欧美黑人性视频| 美女黄色丝袜一区| 日本道色综合久久影院| 九九视频这里只有精品| 亚州国产精品久久久| 色吧影院999| 国产va免费精品高清在线| 国产精品吊钟奶在线| 国产精品69精品一区二区三区| 欧美成人三级视频网站| 这里只有精品在线观看| 国产精品夜间视频香蕉| 国产精品视频网址| 有码中文亚洲精品| 国产精品免费久久久久影院| 国产精品扒开腿做| 日韩的一区二区| 国产91对白在线播放| 国产精品va在线播放| 亚洲伊人一本大道中文字幕| 亚洲aⅴ日韩av电影在线观看| 欧美视频免费在线观看| zzijzzij亚洲日本成熟少妇| 怡红院精品视频| 欧美激情国内偷拍| 日韩中文字幕在线精品| 国产精品电影一区| 一本色道久久综合狠狠躁篇的优点| 久久久久久久久国产精品| 国产精品视频男人的天堂| 国产成人一区二| 欧美猛交ⅹxxx乱大交视频| 97欧美精品一区二区三区| 国内精品久久久久影院 日本资源| 久久免费视频这里只有精品| 欧美乱大交xxxxx另类电影| 日韩午夜在线视频| 欧美大全免费观看电视剧大泉洋| 精品香蕉一区二区三区| 亚洲综合小说区| 国产丝袜一区二区三区| 欧美日韩国产成人高清视频| 中文字幕少妇一区二区三区| 欧美性极品少妇精品网站| 欧美亚洲成人精品| 欧美精品在线网站| 第一福利永久视频精品| 国产精品中文字幕在线观看| 欧美限制级电影在线观看| 91精品国产成人| 欧亚精品在线观看| 影音先锋日韩有码| 精品久久久视频| 色综合久久天天综线观看| 成人国产精品色哟哟| 欧美超级免费视 在线| 亚洲成人精品视频在线观看| 亚洲午夜精品久久久久久久久久久久| 国产成人一区三区| 精品一区二区三区电影| 亚洲精品wwwww| 91久久精品久久国产性色也91| 成人在线视频福利| 欧美激情视频一区| 色播久久人人爽人人爽人人片视av| 亚洲精品国产成人| 久久免费精品视频| 日韩国产高清污视频在线观看| 色播久久人人爽人人爽人人片视av| 亚洲r级在线观看| 亚洲乱码国产乱码精品精| 日韩中文字幕免费| 最新69国产成人精品视频免费| 日韩www在线| 欧美日韩亚洲激情| 欧美在线视频一二三| 最新国产精品拍自在线播放| 国产精品高潮呻吟视频| 日韩av免费在线| 国产精品亚洲综合天堂夜夜| 91精品国产高清久久久久久91| 精品成人久久av| 日韩欧美综合在线视频| 中文字幕免费精品一区高清| 欧美激情国产精品|