上一節我們讨論了視圖中的一些限制以及建議等,這節我們講講關于在UDF和視圖中使用SCHEMABINDING的問題,簡短的内容,深入的了解,Always to review the basics。
在上節中我們講到在視圖建立索引時必須指定SCHEMABINDING,是以我們有必要先去了解下這個知識點再繼續往下講解。SCHEMABINDING到底是什麼呢?在視圖和UDF中有這個選項,如果在視圖和UDF函數中指定了這個選項,那麼說明會将視圖和UDF嚴格綁定到資料庫對象中去,一來指定此選項可以将其嚴格綁定到資料庫對象中去,二來可以提高查詢計劃執行的性能。下面我們來看看關于SCHEMABINDING在UDF和視圖中的使用。
建立UDF函數有三種方式,我們一一來過一遍。
(1)建立TVF内嵌表值函數


上述UDF是通過TVF的方式來建立,當需要在裡面聲明一個臨時變量并傳回時我們需要像如下操作。
(2)建立标量值函數


當利用UDF來對查詢出來的資料進行插入到臨時表中時,我們可以像如下操作
(3)建立多語句TVF内嵌表值函數


好了我們過了一遍關于UDF建立的幾種方式,我們回到主題,我們建立一個如下UDF


此時我們在對應資料庫中的表值函數檔案夾下能看到我們建立的函數
因為上述我們是查詢表compare.t_inner中的值,此時我們删除該表看看。
此時我們會發現該表無法删除出現上述錯誤。因為我們上述建立的UDF依賴于compare.t_inner表,是以現在無法删除該表,該表引用了自定義函數GetId。下面我們修改上述我們在UDF中查詢的列val1為val3看看


此時删除表compare.t_inner依然會出現和UDF中的錯誤。在使用SCHEMABINDING限制時不能進行*操作,會出現如下圖錯誤:


下面再看其他情況利用視圖到跨資料庫進行查詢,我們建立兩個資料庫并分别在對應資料庫建立一個測試表。


接下來通過執行SCHEMABINDING來建立視圖


上述指定SCHEMABINDING出現錯誤也就是說在跨資料庫查詢時會出現錯誤,對于引用對象僅限于兩部分名稱。到這裡我們為在視圖和UDF中使用SCHEMABINDING作出如下結論:
(1)在視圖和UDF中使用SCHEMABINDING時必須滿足兩個要求,第一個是不允許在SELECT子句中使用*,第二個則是當引用對象時必須使用架構限定的兩部分名稱。
(2)在視圖上建立索引時必須指定SCHEMABINDING。
如上講了這麼多關于SCHEMABINDING使用的限制,可以算是缺點吧,難道就沒優點了麼,如果沒優點我們也不會講了,當然也沒必要給出SCHEMABINDING的使用了。當指定SCHEMABINDING時能提高UDF和視圖的查詢性能,當對象指定架構對象時,在查詢計劃中不會産生不必要的Spoll操作。我們看如下例子:
上述我們沒有提供SCHEMABINDING選項,此時UDF不會通路任何資料庫對象,當一個函數和視圖沒有SCHEMABINDING選項時就無法確定底層的資料庫對象是什麼,是以此時會去通路每個正在執行的UDF,為了避免這種性能問題,我們通過指定SCHEMABINDING是安全的并且不會去周遊通路每一個正在運作的UDF。是以在視圖和UDF中一般建議指定SCHEMABINDING選項。
本節我們讨論了在UDF和視圖中指定SCHEMABINDING的問題,其實對視圖查詢還是有諸多限制,大部分情況下利用正常查詢和存儲過程來實作更加靈活。我們下節看看APPLY運算符的使用,簡短的内容,深入的了解,我們下節再會。
本文轉自Jeffcky部落格園部落格,原文連結:http://www.cnblogs.com/CreateMyself/p/6193163.html,如需轉載請自行聯系原作者