Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вычисляемое поле - производительность таблицы  [new]
Виктор_sql
Member

Откуда:
Сообщений: 98
Здравствуйте,
еще раз про вопрос о вычисляемом поле.

Есть таблица на 50 тыс. объектов
Есть таблица на 100 тыс. документов, которые привязаны к этим объектам. По два док-та на один объект. Через таблицу объект-документы.

Требуется получить состояние вычисляемого поля в таб.объектов.
В вычисляемом поле таб.объектов находится ф-ция(входные параметры: ид_объекта, тип_объекта), которая опрашивает наличие этих док-ов у объекта:

IF EXISTS(
SELECT DR.dr_id
FROM doc.Doc_Relation DR, Doc.Doc D
WHERE (DR._id = @id_object) --Ид объекта
AND (DR.type_id = @type_ object) -- Тип объекта
AND (DR.d_id = D.d_id) -- Ид документа
AND ( GetDate() BETWEEN (D.DateBegin) AND (D.DateEnd) ) –- Актуальность док-та по датам
)
Return 1
ELSE Return 0

При селекте на весь список объектов с этим полем, время выполнения увеличивается в разы по сравнению с запросом без наличия в таб.этого поля.
Что можно сделать для оптимизации времени выполнения запроса ? Отказываться от вычисляемого поля не хотелось бы.
Проиндексировать это поле не получилось, т.к. вычисл.поле non-Deterministic. Или в этом случае вычисляемое поле неприменимо из-за затратности в принципе ?
28 дек 11, 11:47    [11838007]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Виктор_sql
Проиндексировать это поле не получилось, т.к. вычисл.поле non-Deterministic.
Но если вместо GETDATE() писать CONVERT(VARCHAR, GETDATE(),126),
то будет детерминированной, наверно.
Ну и WITH SCHEMABINDING в определении функции не забыть
28 дек 11, 12:29    [11838426]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
libru
Member

Откуда:
Сообщений: 877
Виктор_sql
Проиндексировать это поле не получилось, т.к. вычисл.поле non-Deterministic
просто интересно, а что ты хотел чтобы происходило с индексом в полночь?
28 дек 11, 12:31    [11838437]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
hpv
Member

Откуда:
Сообщений: 153
iap,

А как ф-ция может быть детерминированная, если там селект?
28 дек 11, 12:35    [11838470]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Виктор_sql
Проиндексировать это поле не получилось, т.к. вычисл.поле non-Deterministic.
Но если вместо GETDATE() писать CONVERT(VARCHAR, GETDATE(),126),
то будет детерминированной, наверно.
Ну и WITH SCHEMABINDING в определении функции не забыть
Кажется, наврал. Не обращайте на меня внимание.
28 дек 11, 12:38    [11838487]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
hpv
iap,

А как ф-ция может быть детерминированная, если там селект?
Функция не может быть детерминированной, потому что там GETDATE().
Его значение от вызова к вызову может меняться.
28 дек 11, 12:39    [11838497]     Ответить | Цитировать Сообщить модератору
 Re: Вычисляемое поле - производительность таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9826
Виктор_sql,
Ваша функция, как ни старайтесь, останется недетерминированной. Даже если преположить, что вам удалось добиться детерминированности и построить индекс по вычисляемому столбцу, то этот индекс все равно не будет обновляться при изменениях в производных таблицах. Так что отказывайтесь от вычисляемого столбца и пробуйте либо обычный столбец + триггер на таблицу объект-документы для его поддержания, либо индексированное представление (боюсь, оно вам не подойдет).
28 дек 11, 13:24    [11839015]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить