基于应用于列的标量函数的索引

时间:2009-02-12 11:35:42

标签: sql-server indexing user-defined-functions

我有一个用户标量值函数,它接受NVARCHAR(MAX)并返回NVARCHAR(MAX)。为了提高利用此函数的GROUP BY命令的性能,我想创建一个基于它的索引。但是documentation表示CREATE INDEX命令只接受列而不是表达式,所以这是非法的:

CREATE INDEX an_index ON a_table (foo(a_column))

有任何解决方法吗?

谢谢!

1 个答案:

答案 0 :(得分: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之类的非确定性函数上构建索引,每次调用它时都会更改其返回值。

如果您发布要编入索引的函数,将更容易解决您的情况。