2009-02-12 80 views
1

我有一個用戶標量值函數,它需要NVARCHAR(MAX)並返回NVARCHAR(MAX)。爲了增加使用這個函數的GROUP BY命令的性能,我想創建一個也基於它的索引。但是documentation說什麼CREATE INDEX命令只列不是表達式,因此這是非法的:基於應用於列的標量函數的索引

CREATE INDEX an_index ON a_table (foo(a_column)) 

是任何變通辦法?

謝謝!

回答

4

你需要創建一個計算列:

CREATE TABLE a_table (a_column NVARCHAR(MAX), a_foo AS foo(a_column)) 
CREATE INDEX an_index ON a_table (a_foo) 

爲了可轉位,功能foo必須的,當然,滿足一定的要求:

索引計算列來調用用戶定義函數

當用戶定義函數具有以下屬性值時,可以在索引中使用調用用戶定義函數的計算列:

  • IsDeterministic = true
  • IsSystemVerified = true(除非計算列被持久)
  • UserDataAccess = false
  • SystemDataAccess = false

不能建立在非確定性函數的索引等GETDATE改變每次你打電話時它的返回值。

如果您發佈要索引的函數,將更容易解決您的問題。