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

Откуда:
Сообщений: 129
Есть большая табличка, скажем ярд строчек.
Хочу добавить новое поле, дата с getdate() по умолчанию, и индекс на это же поле с фильтром IS NOT NULL.
Таким образом индекс будет актуальным только на новые строчки.
Хотелось бы всё это дело забабахать так, что б не делать бесполезного сканнирования таблицы.

Есть идеи?
26 апр 17, 16:41    [20436931]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Зачем фильтрованный? Сделать просто индекс, и всё.
26 апр 17, 16:44    [20436947]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Daba
Хотелось бы всё это дело забабахать так, что б не делать бесполезного сканнирования таблицы.

Есть идеи?
Добавьте сначала поле NULL, потом установите default.
Тогда это будет быстро, просто изменение метаданных.
Ну а потом уже создайте фильтрованный индекс.
26 апр 17, 16:44    [20436951]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
Daba
Member

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

время берёт создание индекса, т.к. сервер решает сканнировать всю таблицу.

Я пытался создать констрейнт типа того чтоб обьяснить что в таблице нет ничего кроме NULL:
ALTER TABLE dbo.test  ADD dt_getdate DATETIME DEFAULT GETDATE(), CONSTRAINT c check (dt_getdate IS null)


А потом создаю индекс с фильтром:
CREATE NONCLUSTERED INDEX ix_f_temp_dt_getdate ON dbo.test (dt_getdate) WHERE dt_getdate IS NOT NULL;


Мне кажется логичным что сервер не будет сканнировать, но не тут то было :(.
26 апр 17, 17:01    [20437023]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Daba,

поле, индекс, дефолт... хотя и не уверен, что индекс построит не смотря никуда
26 апр 17, 17:06    [20437043]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Daba,
а как Вы представляете составление справочника значений без просмотра всех строк? По всей видимости Вы не понимаете, что такое индекс.
26 апр 17, 17:57    [20437244]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Владислав Колосов
Daba,
а как Вы представляете составление справочника значений без просмотра всех строк? По всей видимости Вы не понимаете, что такое индекс.
Зачем просматривать, если отсутствие не-NULL значений гарантируется сервером, а индекс фильтрованный на NOT NULL?
Создал пустую структуру индекса, и готово.

Другое дело, фича настолько маловостребованая, что разработчики это не реализовали.
26 апр 17, 18:52    [20437445]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Daba
Я пытался создать констрейнт типа того чтоб обьяснить что в таблице нет ничего кроме NULL:
Вообще говоря, создание такого констрейна тоже требует такого же сканирования инедкса - если он WITH CHECK
А если нет, то он ничего не гарантирует, о чём будет в sys.check_constraints указан флаг is_not_trusted
26 апр 17, 18:55    [20437458]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
msLex
Member

Откуда:
Сообщений: 8091
alexeyvg
Daba
Я пытался создать констрейнт типа того чтоб обьяснить что в таблице нет ничего кроме NULL:
Вообще говоря, создание такого констрейна тоже требует такого же сканирования инедкса

Даже если добавление nullble поля и is null констрейна в одной инструкции?
26 апр 17, 20:03    [20437600]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
Daba
Member

Откуда:
Сообщений: 129
msLex
alexeyvg
пропущено...
Вообще говоря, создание такого констрейна тоже требует такого же сканирования инедкса

Даже если добавление nullble поля и is null констрейна в одной инструкции?


Вот я о том же... Помоему просто ребята из МС тут не запаривались.
26 апр 17, 20:22    [20437650]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
Daba
Member

Откуда:
Сообщений: 129
Владислав Колосов
Daba,
а как Вы представляете составление справочника значений без просмотра всех строк? По всей видимости Вы не понимаете, что такое индекс.


Конечно, только Вы понимаете...
26 апр 17, 20:23    [20437654]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро создать фильтрованный индекс на новое поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
msLex
alexeyvg
пропущено...
Вообще говоря, создание такого констрейна тоже требует такого же сканирования инедкса

Даже если добавление nullble поля и is null констрейна в одной инструкции?
Вообще да, сервер может сообразить, что данные проверены :-)
Нужно сделать эксперимент...

Да, ставит is_not_trusted=0

Но вот, при создании индекса это не учитывается :-(
26 апр 17, 20:46    [20437719]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить