什么叫即席查詢
這個僅當是筆記
以前一直不知道什么叫即席查詢,今天重新看了一遍《SQLSERVER企業級管理平台》,才明白什么叫“即席查詢”
下面這句話是我個人總結的:
什么叫即席查詢
AD-HOC :以單獨的SQL語句的形式執行的查詢就是即席查詢,比如說:在C#程序里嵌入的SQL語句,或者在SSMS里的新建查詢窗口自己鍵入的SQL代碼就是即席查詢。
而將SQL代碼放入存儲過程里面,以存儲過程或者函數或者觸發器來執行的查詢就不是即席查詢,即席:當場,就是當場去查詢,當然,這個當場不是當場寫代碼的意思啦
-------------------------------------------華麗的分割線---------------------------------------------------------
那么,即席查詢是不是沒有執行計划的緩存的呢?
在《SQLSERVER企業級管理平台》里是這樣說的
adhoc:即席查詢
Adhoc語句
一組包含select,insert,update,delete的批處理指令。對這樣的指令,只有前后完全一致
包括字母的大小寫,空格,回車換行都一致,SQL才認為是兩條一樣的語句,才能夠重用執行計划。所以這個要求還是挺高的
1 --例如,運行下面的指令,連續兩次查詢sys.[syscacheobjects]視圖 2 DBCC freeproccache 3 GO 4 SELECT * FROM sys.[syscacheobjects] 5 go 6 SELECT * FROM [sys].[syscacheobjects] 7 go
在第二個結果集里會看到兩個adhoc的執行計划。他們的差別就在於一個有回車一個沒有回車
但是如果語句是一樣的,那么第二句話就可能會重用前面的執行計划。所以adhoc語句並不一定沒有執行計划的重用
1 --例如下面,把同樣的一句話跑兩遍,會發現只有一個執行計划,而且他被使用過兩次 2 --(字段usecount=2) 3 4 DBCC freeproccache 5 GO 6 SELECT * FROM sys.[syscacheobjects] 7 go 8 SELECT * FROM sys.[syscacheobjects] 9 go
SQL2005以后,可以在單個數據庫上開啟強制參數化。也就是說,對於在這個數據庫下運行的大部分語句,
SQL都會先參數化,再運行。如果應用經常用adhoc方式調用一樣的語句,強制參數化可能會有所幫助
----------------------------------------------華麗的分割線------------------------------------------------------------------------
那么分布式查詢會不會重用執行計划呢?
我使用下面代碼測試了一下
1 --第一次執行的時候,先清空執行計划緩存,第二次執行就要把DBCC freeproccache注釋掉 2 DBCC freeproccache 3 GO 4 5 6 SELECT * FROM 7 OPENROWSET('microsoft.jet.oledb.4.0','C:\Users\Administrator\Desktop\Course.mdb';'admin';'',Course_baseinfo) 8 GO 9 10 SELECT [cacheobjtype],[objtype],[dbid],[usecounts],[sql] FROM sys.[syscacheobjects] 11 WHERE [dbid]=1 12 go
根據usecounts字段,每執行一次都會遞增,說明是有重用執行計划的
附上測試用的mdb文件,記得使用分布式查詢的時候需要安裝office的哦,如果是64位操作系統,需要安裝64位 Microsoft.ACE.OLEDB.12.0
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/58c4c61e-fa86-4809-bf7d-21bacb055d3e
文件地址:http://files.cnblogs.com/lyhabc/Course.rar
如果有不對的地方,歡迎大家拍磚o(∩_∩)o