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

首頁 > 數據庫 > SQL Server > 正文

Sql Server之旅——第十二站 sqltext的參數化處理

2024-08-31 00:54:48
字體:
來源:轉載
供稿:網友
Sql Server之旅——第十二站 sqltext的參數化處理

  說到sql的參數化處理,我也是醉了,因為sql引擎真的是一個無比強大的系統,我們平時做系統的時候都會加上緩存,我想如果沒有緩存,就不會有什么

大網站能跑的起來,而且大公司一般會在一個東西上做的比較用心,比較細,sqlserver同樣也使用了緩存,其中就包括Data cache 和Plan cache兩個大頭。

現在我們也知道了Plan cache包括上一篇生成的xml結構和sql text,更有趣的是,sql text 還可以做到參數化。。。也就是模板化了。。

一:Sql參數化

<1>先來做一個Person表,插入1000條數據,然后清空下緩存,再select出一個數據,如圖:

1 DROP TABLE dbo.Person2 CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(5) DEFAULT 'aaaaa')3 INSERT INTO dbo.Person DEFAULT VALUES4 go 10005 6 DBCC freePRoccache7 SELECT * FROM dbo.Person WHERE ID=100

<2> 數據已經查詢出來了,下面我們看下dm_exec_sql_text中的sql會是怎樣?

1 SELECT usecounts,objtype,cacheobjtype, plan_handle,query_plan,text FROM sys.dm_exec_cached_plans2 CROSS APPLY sys.dm_exec_query_plan(plan_handle)3 CROSS APPLY sys.dm_exec_sql_text(plan_handle)4 WHERE text LIKE '%Person%'

從上面的圖中可以看到,當我select一下后,出現了兩個sql text,第一個叫Adhoc(即時查詢),一個叫Prepared(參數化),然后我點擊第二個記錄

的query_plan,會出現圖形化的執行計劃,如下圖:

跟著好奇心,我繼續點擊第三個記錄的query_plan會是怎樣???

通過這兩個sql text的執行計劃,不知道你觀察出來下面四點了沒有:

(1)我的sql是執行表掃描的,這個沒有問題,問題在于我的兩個sql text中,第一個plan居然沒有完整的執行計劃,而僅僅是一個圖形化的select,

第二個參數化sql,它的plan是一個完整的執行計劃。。。那這說明什么呢???既然Prepared是完整的執行計劃,那干嘛還要把adhoc這個

sql緩存起來呢???其實這個我也不清楚。。。我猜測肯定是讓引擎快速的找到prepared這個完整的執行計劃吧。。。

(2) 就是想為什么sqltext要做參數化,仔細想想應該明白參數化的目的就是為了重用執行計劃,因為這時候的xml已經生成好了,不然的話,你

每次執行的sql中只要參數不同都要生成一次query_plan的xml,是不是會拉查詢速度的后腿呢???

(3) 你有沒有關注到參數化的類型是tinyint,看到這個tinyint我馬上就想破它了,我們知道tinyint就是byte類型,表示的范圍也就到256...也許

    引擎看我where 100才覺得我好欺負。。。那我現在想法就是where 500,看看會是什么效果???

1 SELECT * FROM dbo.Person WHERE ID=5002 3 SELECT usecounts,objtype,cacheobjtype, plan_handle,query_plan,text FROM sys.dm_exec_cached_plans4 CROSS APPLY sys.dm_exec_query_plan(plan_handle)5 CROSS APPLY sys.dm_exec_sql_text(plan_handle)6 WHERE text LIKE '%Person%'

從圖中可以看到,當我where 500的時候,引擎會再次生成一個prepared的sqltext,這樣就有兩個prepared了,那我在想,為什么不直接

  給一個(@1 int)呢???像目前這樣sql引擎的處理方式,會有幾條prepared記錄的xml和sqltext的,是不是有點浪費內存呢?

(4) 仔細想想你會知道,sql引擎還是挺色膽包天的,因為prepared的記錄已生成,執行計劃也就生成了。。。。那說明什么呢???說明這時候

  的xml已經是死的了,也就說明執行計劃也是定死的了,難道@1參數的不同不會導致執行計劃有變更么???如果有變更難道還讓我執行原來

這個表掃描執行計劃么???有點奇葩,好了,我準備在下面仔細說說。

二:參數的變化對prepared的影響

  如果你看過之前的博文,你應該明白有一個叫做書簽查找的玩意。。。它的原理是在非聚集索引上通過B樹查找,當查找到目標鍵的時候拿到這

個鍵的聚集索引key,然后通過key來取數據的記錄,如果你的非聚集索引的鍵值的唯一性比較高,這時候sql引擎會走書簽查找,但是如果你的鍵值

唯一性比較低或者在數據量比較小的情況,sql引擎就不會走書簽查找,而轉向聚集索引掃描。。。那這說明什么呢?說明執行計劃在有些時候會跟

(@1 int)這個值有關系。。。那這樣的話貌似就不能重用執行計劃了,對吧。。。。為了驗證sql引擎怎么處理的,我們來做一個測試。

1.先清空緩存,再在Name列上建索引,然后我們select下,如下圖:

1 DBCC freeproccache2 CREATE INDEX idx_Name ON dbo.Person(NAME)3 SELECT * FROM dbo.Person WHERE NAME='aaaaa'

2. 然后還是繼續看看xml和sqltext

你有什么發現嗎?在記錄中并沒有發現什么prepared記錄,這說明什么。。。說明sqlserver很聰明,它知道Name可能會有 “表掃描”到

“書簽掃描”的來回切換,為了驗證問題,我繼續向Person表插入1w條數據,然后再插入一個唯一性數據。如下圖:

1 INSERT INTO dbo.Person DEFAULT VALUES2 go 100003 INSERT INTO dbo.Person(NAME ) VALUES ('ccccc')

確實,如我猜想的一樣,sqlserver很聰明的。。。如果它覺得這個Name不靠譜的話,它是絕對不敢給這條sqltext生成prepared的。。。轉過

頭來再想想第一條為什么會有sqltext,那是因為a列不管取值多少,都改變不了走表掃描的現實,所以sql引擎才敢這么大膽。。。突然覺得人生

不就是這樣嘛????很多人都是不把穩的事情是絕對不敢做的。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品综合一区91| 日韩精品免费电影| 色偷偷av亚洲男人的天堂| 欧美最猛性xxxxx亚洲精品| 2019中文在线观看| 亚洲最大福利视频网| 欧美精品久久久久久久免费观看| 91手机视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 亚洲国产精品成人一区二区| 日韩免费在线观看视频| 亚洲在线www| 国产精品美女免费视频| xvideos国产精品| 欧美日韩在线视频一区| 午夜精品一区二区三区在线视| 亚洲视频电影图片偷拍一区| 欧美精品videossex88| 国产精品麻豆va在线播放| 久久久久久九九九| 国产精品久久一区| 国语自产精品视频在线看一大j8| 国内外成人免费激情在线视频网站| 亚洲欧美日韩精品久久亚洲区| 亚洲欧美激情另类校园| 欧美人成在线视频| 97福利一区二区| 亚洲韩国欧洲国产日产av| 精品国产一区二区三区四区在线观看| 国产亚洲精品久久| 欧美一区二区大胆人体摄影专业网站| 久久久久久久久久久久av| 亚洲老板91色精品久久| 日韩福利在线播放| 日韩网站免费观看高清| 91麻豆国产语对白在线观看| 日韩一区二区精品视频| 国产精品一久久香蕉国产线看观看| 色婷婷久久一区二区| 久久精品国产精品| 国内精品小视频在线观看| 国产精品v日韩精品| 久久久亚洲福利精品午夜| 久久精品视频va| 欧美乱大交xxxxx另类电影| 九九热视频这里只有精品| 精品调教chinesegay| 亚洲精品国产品国语在线| 中国日韩欧美久久久久久久久| 国产日韩欧美日韩大片| 成人中文字幕在线观看| 91超碰caoporn97人人| 亚洲大胆美女视频| 日韩在线观看免费全集电视剧网站| 欧美另类极品videosbest最新版本| 亚洲人成网站999久久久综合| 91欧美精品成人综合在线观看| 久久伊人精品一区二区三区| 在线观看久久久久久| 国产午夜精品美女视频明星a级| 亚洲国产欧美一区| 欧美激情成人在线视频| 国产亚洲免费的视频看| 97热在线精品视频在线观看| 美女av一区二区三区| 日韩少妇与小伙激情| 亚洲国产成人爱av在线播放| 日韩av影视在线| 亚洲人成电影网站色www| 欧美交受高潮1| 欧美日韩国产成人在线观看| 91精品国产自产91精品| xxx成人少妇69| 狠狠躁夜夜躁人人爽超碰91| 66m—66摸成人免费视频| 久久精品这里热有精品| 亚洲国产精品一区二区三区| 精品综合久久久久久97| 91精品久久久久久久久久另类| 色婷婷av一区二区三区在线观看| 亚洲欧美日韩国产中文专区| 国产日韩在线精品av| 国产精品极品美女粉嫩高清在线| 在线精品高清中文字幕| 92裸体在线视频网站| 国产精品福利网| 欧美日韩国产精品一区二区不卡中文| 欧美视频在线观看免费网址| 成人国产精品一区二区| 亚洲国语精品自产拍在线观看| 午夜精品三级视频福利| 毛片精品免费在线观看| 久久久精品影院| 国产精品99久久久久久久久| 成人免费xxxxx在线观看| 亚洲国产成人av在线| 国产精品久久久久久久久久三级| 精品国产精品自拍| 国产91在线播放九色快色| 亚洲人成网站在线播| 精品久久久久久| 国产精品91在线| 久久青草福利网站| 亚洲综合在线播放| 韩剧1988免费观看全集| 91老司机精品视频| 精品视频偷偷看在线观看| 日韩福利视频在线观看| 精品久久久久久电影| 亚洲国产精品成人精品| 国产精品综合不卡av| 在线成人免费网站| 中文字幕久久亚洲| 亚洲情综合五月天| 一本色道久久综合狠狠躁篇怎么玩| 国产视频精品一区二区三区| 国产精品海角社区在线观看| 国产精品永久免费在线| 91亚洲国产精品| 亚洲国产福利在线| 久久久久久中文字幕| 日韩中文字幕在线观看| 九九热这里只有在线精品视| 欧美三级欧美成人高清www| 九九视频直播综合网| 欧美电影在线免费观看网站| 国产精品久久久久久超碰| 欧美在线一区二区视频| 性色av一区二区三区免费| 免费99精品国产自在在线| 精品国产一区av| 美女久久久久久久| 88xx成人精品| 亚洲人成电影在线| 亚洲国产精品专区久久| 成人性生交xxxxx网站| 日韩女优人人人人射在线视频| 欧美午夜片欧美片在线观看| 国产精品mp4| 久久久久久久久国产精品| 欧美日韩精品国产| 国产精品爽黄69天堂a| 91精品视频大全| 538国产精品一区二区免费视频| 91高清视频在线免费观看| 精品国产区一区二区三区在线观看| 中文字幕av一区| 亚洲一区亚洲二区| 亚洲欧美制服丝袜| 国产成人精品电影久久久| 欧美日韩国产中字| 日本精品va在线观看| 成人中文字幕在线观看| 国产精品专区一| 亚洲第一综合天堂另类专| 精品亚洲精品福利线在观看| 日韩视频―中文字幕| 亚洲伊人久久大香线蕉av| 蜜臀久久99精品久久久无需会员| 亚洲第一精品久久忘忧草社区| 亚洲欧美日韩精品久久奇米色影视| 日韩电影在线观看永久视频免费网站| 欧美体内谢she精2性欧美| 欧美精品video|