Индекс, основанный на скалярной функции, примененной к столбцу - PullRequest
1 голос
/ 12 февраля 2009

У меня есть пользовательская скалярная функция, которая принимает NVARCHAR (MAX) и возвращает NVARCHAR (MAX). Чтобы повысить производительность команды GROUP BY с помощью этой функции, я хотел создать индекс, также основанный на ней. Но документация говорит, что команда CREATE INDEX принимает только столбцы, а не выражения, поэтому это недопустимо:

CREATE INDEX an_index ON a_table (foo(a_column))

Есть ли обходные пути?

Спасибо!

1 Ответ

4 голосов
/ 12 февраля 2009

Вам нужно будет создать вычисляемый столбец:

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, которая меняет свое возвращаемое значение каждый раз, когда вы вызываете ее.

Будет проще решить ваше дело, если вы разместите функцию, по которой хотите индексировать.

...