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

首頁 > 開發 > 綜合 > 正文

統計--VARCHAR與NVARCHAR在統計預估上的區別

2024-07-21 02:48:33
字體:
來源:轉載
供稿:網友
統計--VARCHAR與NVARCHAR在統計預估上的區別

最近遇到一個問題,當查詢使用到模糊查詢時,由于預估返回行數過高,執行計劃認為索引查找+Key Lookup的成本過高,因此采用Clustered Index Scan的方式,消耗大量邏輯IO,執行計劃較差。

經過測試,發現對于模糊查詢,NVARCHAR和VARCHAR的預估返回行數差距很大,因此拿出來供大家一起測試。

首先生成測試數據,分別創建TB101和TB102的表,表上有相同的聚集索引和非聚集索引,表中有100w數據,創建測試數據腳本如下:

DROP TABLE TB101GODROP TABLE TB102GOSELECT CAST(NCHAR(19968+20902*RAND(RID))+NCHAR(19968+20902/2*RAND(RID))+NCHAR(19968+20902/3*RAND(RID)) AS varchar(40)) AS RName,*INTO TB101FROM(SELECT ROW_NUMBER()OVER(ORDER BY T1.OBJECT_ID DESC) AS RID,T1.* FROM sys.all_objects T2CROSS JOIN sys.all_columns T1) AS TWHERE T.RID<1000000GOSELECT * INTO TB102 FROM TB101GOALTER TABLE TB102ALTER COLUMN RName NVARCHAR(40)GOCREATE UNIQUE CLUSTERED INDEX IDX_RID ON TB101(RID)GOCREATE UNIQUE CLUSTERED INDEX IDX_RID ON TB102(RID)GOCREATE INDEX IDX_Name ON TB101(RName)GOCREATE INDEX IDX_Name ON TB102(RName)GOEXEC sp_spaceused 'TB101'EXEC sp_spaceused 'TB102'GO

兩表使用空間相同,數據相同。

測試前先更新下統計:

--更新統計UPDATE STATISTICS TB101 WITH FULLSCANGOUPDATE STATISTICS TB102 WITH FULLSCAN

開始測試1

SELECT RName FROM TB101WHERE RName LIKE '你好%'

其執行計劃為:

測試2:

SELECT RName FROM TB102WHERE RName LIKE N'你好%'

感謝網友“害怕飛的鳥”的提醒,我們測試了以中文開頭的模糊查詢,需要測試以字母開頭的模糊查詢。

因此重新創建測試用例(生成新的測試數據目的為了避免查詢值落在統計的兩端,原理請參考大神高繼偉的SQL Server 統計信息(Statistics)-概念,原理,應用,維護)

準備測試數據:

SELECT CAST(NCHAR(65+25*RAND(RID))+NCHAR(24*RAND(RID))+NCHAR(19968+20902/2*RAND(RID))+NCHAR(19968+20902/3*RAND(RID)) AS varchar(40)) AS RName,*INTO TB103FROM(SELECT ROW_NUMBER()OVER(ORDER BY T1.OBJECT_ID DESC) AS RID,T1.* FROM sys.all_objects T2CROSS JOIN sys.all_columns T1) AS TWHERE T.RID<1000000GOSELECT * INTO TB104 FROM TB103GOALTER TABLE TB104ALTER COLUMN RName NVARCHAR(40)GOCREATE UNIQUE CLUSTERED INDEX IDX_RID ON TB103(RID)GOCREATE UNIQUE CLUSTERED INDEX IDX_RID ON TB104(RID)GOCREATE INDEX IDX_Name ON TB103(RName)GOCREATE INDEX IDX_Name ON TB104(RName)GO

測試1:

SELECT RName FROM TB103WHERE RName LIKE 'A你好%'

測試2:

SELECT RName FROM TB104WHERE RName LIKE N'A你好%'

通過上面四個測試,可以得出以下結論:

1. 當字段的數據類型為NVARCHAR時,無論模糊查詢以中文還是英文字母開頭,預估返回行數和實際返回行數相差不多

2. 當字段的數據類型為VARCHAR且模糊查詢以英文字母開頭,預估返回行數和實際返回行數相差不多

3. 當字段的數據類型為VARCHAR且模糊查詢以中文開頭,預估返回行數和實際返回行數相差較大。

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

當預估返回行數與實際返回行數相差較大時,就很容易生成較差的執行計劃,如對于查詢:

SELECT * FROM TB101WHERE RName LIKE '你好%'

由于預估索引查找會返回50w的數據,查詢優化器引擎認為如果使用索引查找+Key Lookup就會消耗上200W+的邏輯IO, 效率會遠低于表掃描,因此有了下面的執行計劃:

而實際上,經過索引查找后,只會返回少量的數據行,這些行做Key Lookup也只會消耗少量的邏輯IO,因此索引查找+Key Lookup是最高效的。

解決辦法:

對于這種問題,可以有幾種辦法處理:

1. 強制索引查找

SELECT * FROM TB101 WITH(FORCESEEK)WHERE RName LIKE '你好%'

2. 使用隱式轉化

SELECT * FROM TB101WHERE RName LIKE N'你好%'

經過一次隱式轉換后,預估返回行數出奇地下降下來,生成了正確的執行計劃(看來隱式轉換也是有存在價值地哦)

3. 如果不想修改程序的話,可以考慮使用參數化和執行計劃指南來實現

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

總結(以下結論未經過大神認證,請自行組鑒別正確性):

1. 當字段的數據類型為NVARCHAR時,無論模糊查詢以中文還是英文字母開頭,預估返回行數和實際返回行數相差不多

2. 當字段的數據類型為VARCHAR且模糊查詢以英文字母開頭,預估返回行數和實際返回行數相差不多

3.當字段的數據類型為VARCHAR且模糊查詢以中文開頭,預估返回行數和實際返回行數相差較大。

4. 隱式轉換未必會導致表掃描或索引掃描,也未必會導致執行計劃質量不優。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线视频网| 国产精品香蕉在线观看| 久久久久女教师免费一区| 色偷偷88888欧美精品久久久| 久久亚洲国产精品| 1769国产精品| 成人午夜高潮视频| 国产成人一区二区在线| 国产成人免费av| 精品亚洲男同gayvideo网站| 国产专区精品视频| 欧美精品videossex性护士| 久久99青青精品免费观看| 一本色道久久综合狠狠躁篇的优点| 欧美电影电视剧在线观看| 亚洲一区第一页| 亚洲一区美女视频在线观看免费| 日韩人体视频一二区| 成人午夜小视频| 欧美电影《睫毛膏》| 亚洲一区二区中文字幕| 国产在线98福利播放视频| 成人美女av在线直播| 欧美日韩在线视频一区二区| 欧美风情在线观看| 亚洲欧美日本伦理| 欧美日韩国产影院| 国产精品久久久久久超碰| 精品美女久久久久久免费| 日韩国产欧美精品在线| 91wwwcom在线观看| 在线观看日韩视频| 国产精品久久电影观看| 992tv成人免费影院| 久久久影视精品| 日韩av网站电影| 91黄色8090| 日韩电影免费观看在线观看| 久久久精品视频成人| 不卡av在线播放| 亚洲欧美综合区自拍另类| 国产一区二区三区免费视频| 欧美精品videosex极品1| 久久精品色欧美aⅴ一区二区| 亚洲欧美国产精品va在线观看| 亚洲欧洲国产精品| 久久天天躁狠狠躁老女人| 热久久这里只有| 久久视频这里只有精品| 九九热精品视频在线播放| 亚洲精品成人久久电影| 国产欧美久久一区二区| 国产自摸综合网| 91精品久久久久久久久久久久久久| 亚洲日韩中文字幕在线播放| 欧美xxxx综合视频| 美女国内精品自产拍在线播放| 夜夜嗨av一区二区三区免费区| 欧美一级电影免费在线观看| 欧美激情a在线| 亚洲精品一区二区网址| 亚洲风情亚aⅴ在线发布| 91高清视频免费| 日韩av手机在线看| 岛国视频午夜一区免费在线观看| 国产一区二区三区三区在线观看| 亚洲欧美精品在线| 欧美日韩国产页| 最近2019年日本中文免费字幕| 欧美成人免费一级人片100| 日本免费一区二区三区视频观看| 亚洲欧美日本精品| 欧美国产极速在线| 日本精品性网站在线观看| 亚洲sss综合天堂久久| 久久久91精品| 国产99视频精品免视看7| 日韩中文字幕第一页| 亚洲一区二区三区视频播放| 98精品国产高清在线xxxx天堂| 国产一区二区黄| 95av在线视频| 91精品久久久久久久久久久久久| 国产精品入口免费视| 亚洲国产女人aaa毛片在线| 国产精品成av人在线视午夜片| 九九热精品视频| 国产不卡一区二区在线播放| 欧美成人精品激情在线观看| 日韩中文字幕国产| 久久久国产精品x99av| 久久久国产精彩视频美女艺术照福利| 成人免费视频在线观看超级碰| 在线观看久久久久久| 欧美日本啪啪无遮挡网站| 91久久在线观看| 成人黄色av免费在线观看| 国产精品黄色av| 久久av在线看| 九九久久久久久久久激情| 中文字幕亚洲综合久久筱田步美| 不用播放器成人网| 青青久久av北条麻妃海外网| 欧美老少做受xxxx高潮| 久久久久99精品久久久久| 91久久精品久久国产性色也91| 国产精品三级美女白浆呻吟| 亚洲国产精品久久91精品| www.美女亚洲精品| 北条麻妃久久精品| 日韩最新在线视频| 日韩免费av在线| 久久久久久久久国产精品| 久久影院模特热| 国产一区二区三区四区福利| 国产精品久久视频| 亚洲人高潮女人毛茸茸| 欧美午夜宅男影院在线观看| 97**国产露脸精品国产| 亚洲福利在线观看| 久久手机免费视频| 91精品视频免费观看| 亚洲区免费影片| 欧美日韩在线视频观看| 九色精品免费永久在线| 国产日韩在线看| 亚洲a在线观看| 亚洲无av在线中文字幕| 91精品国产综合久久久久久蜜臀| 日产精品99久久久久久| 国产精品久久网| 日韩在线观看免费高清完整版| 97国产精品人人爽人人做| 日韩视频亚洲视频| 欧美丰满片xxx777| 国产精品一区二区久久久| 日韩视频一区在线| 国产日本欧美一区二区三区| 欧美性猛交xxxxx水多| 精品久久久久久| 国产精品久久久999| 亚洲图片在线综合| 成人国产精品色哟哟| 国产在线精品成人一区二区三区| 亚洲欧美激情在线视频| 亚洲va国产va天堂va久久| 日本一区二区三区在线播放| 欧美黑人巨大精品一区二区| 日韩第一页在线| 日韩在线激情视频| 国产精品电影久久久久电影网| 国产一区二区三区在线观看网站| 亚洲第一级黄色片| 国a精品视频大全| 国产成人综合精品| 亚洲已满18点击进入在线看片| 97视频免费观看| 欧美激情videos| 国产极品精品在线观看| 日韩a**站在线观看| 欧美午夜久久久| 亚洲理论片在线观看| 日韩美女写真福利在线观看| 亚洲精品mp4|