天天看點

确定性函數和非确定性函數

比如:ABS 傳回給定數字表達式的絕對值,每次輸入相同的參數值,所得的結果都是相同的,是以它是确定函數;而 GETDATA 傳回目前系統時間,每次調用的結果都不同,是以它是非确定函數。

  • 如果 computed_column_expression 引用任何非确定性函數,則不能在計算列上建立索引。
  • 如果視圖引用任何非确定性函數,則不能在視圖上建立聚集索引。

使用者定義函數的确定性

使用者定義函數是确定性函數還是非确定性函數取決于函數是如何編碼的。在以下情況中使用者定義函數是确定性函數:

  • 函數是架構綁定函數。
  • 所有由使用者定義函數調用的函數(包括内置函數或其它使用者定義函數)都是确定性函數。
  • 函數主體不引用該函數作用域以外的資料庫對象。例如,确定性函數不能引用函數的局部表變量以外的表。
  • 該函數不調用任何擴充存儲過程。由于擴充存儲過程對資料庫會産生副作用,是以調用擴充存儲過程的函數是不确定性的。副作用是對資料庫的全局狀态的更改,如對表的更新、對檔案或網絡等外部資源的更新(例如,修改檔案或發送電子郵件)。

不滿足以上條件的使用者定義函數标記為非确定性函數。另外,内置非确定性函數不能用在使用者定義函數的主體中。

繼續閱讀