我有一个用户标量值函数,它接受NVARCHAR(MAX)并返回NVARCHAR(MAX)。为了提高利用此函数的GROUP BY命令的性能,我想创建一个基于它的索引。但是documentation表示CREATE INDEX命令只接受列而不是表达式,所以这是非法的:
CREATE INDEX an_index ON a_table (foo(a_column))
有任何解决方法吗?
谢谢!
答案 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
之类的非确定性函数上构建索引,每次调用它时都会更改其返回值。
如果您发布要编入索引的函数,将更容易解决您的情况。