2009-02-12 78 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改变每次你打电话时它的返回值。

如果您发布要索引的函数,将更容易解决您的问题。