什么叫即席查詢


什么叫即席查詢

這個僅當是筆記

以前一直不知道什么叫即席查詢,今天重新看了一遍《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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM