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

Откуда: Минск
Сообщений: 210
Здравствуйте коллеги.
MSSQL 2008R2 EE.

Описание проблемы:
На данный момент есть таблица (TDetails) в которую раз в сутки записываются подробные данные об определенных транзакциях.
Есть вторая таблица (TAgregated) в которую раз в сутки (сразу после вставки в TDetails) вставляются агрегированные данные из TDetails.
Данные агрегируются по 17 столбцам (на остальные столбцы накладываются агрегирующие функции).
Делаются эти операции джобом по расписанию.
Данные обоих таблиц используются репортами (т.е. такой DataWarehouse).
По разным причинам во второй таблице агрегированные данные со временем начинают отличаться от просуммированных данных в первой таблице.

Как я пытаюсь решить проблему:
Я решил создать индексированное view для агрегации данных вместо содержания TAgregated.
Вьюшку создал без проблем, но вот индекс для нее...
Индекс в данной ситуации надо создавать по столбцам группировки, но столбцов 17.

Соответственно получаю ошибку:
The index 'IX_vw_xxx' on table 'TAgregated' has 17 column names in index key list. The maximum limit for index or statistics key column list is 16.

Подскажите можно ли в моем случае воспользоваться индексированной вьюшкой для агрегации по 17 столбцам ?
Спасибо :)
10 дек 12, 20:03    [13609255]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Зачем вам индекс по 17 полям? O_o
10 дек 12, 22:51    [13609823]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
dobrik
Member

Откуда: Минск
Сообщений: 210
Индекс мне нужен только для того чтоб данные вьюшки были в подсчитанном состоянии, т.к. данных для агрегации очень много и неиндексированная вьюшка будет работать долго. А 17 столбцов в моих агрегированных данных и есть уникальный идентификатор строки. В идеале мне достаточно было бы добавить любой синтетический столбец типа счетчика (или даже ROW_NUMBER()) как уникальный идентификатор строки, но в индексированном вью нельзя использовать оконные функции да и Identity столбец во вьюшке не создашь...
11 дек 12, 13:47    [13612470]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
Glory
Member

Откуда:
Сообщений: 104760
Capacity specification
Columns per index key - 16
In SQL Server, you can include nonkey columns in a nonclustered index to avoid the limitation of a maximum of 16 key columns. For more information, see Index with Included Columns.
11 дек 12, 13:49    [13612491]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
dobrik
Member

Откуда: Минск
Сообщений: 210
К сожалению про это ограничение мне сервер и выдал. А в данном случае я не смогу воспользоваться Included столбцами для уменьшения количества столбцов в уникальном идентификаторе.
Следовательно из этой ситуации я могу сделать вывод: если в MSSQL имеем группировку более чем по 16 столбцам, то про индексированное вью с агрегацией можно забыть...
А жаль... :(
11 дек 12, 13:55    [13612528]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Что мешает объединить два столбца? Например два int в один bigint?
11 дек 12, 13:59    [13612550]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
Glory
Member

Откуда:
Сообщений: 104760
dobrik
Следовательно из этой ситуации я могу сделать вывод: если в MSSQL имеем группировку более чем по 16 столбцам, то про индексированное вью с агрегацией можно забыть...

А причем тут группировка и вью ?
Это ограничение для любого индекса

А "уникальный идентификатор строки" из 17 полей - это перебор. Имхо
11 дек 12, 14:00    [13612558]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
dobrik
Member

Откуда: Минск
Сообщений: 210
invm
Что мешает объединить два столбца? Например два int в один bigint?


А вот это кстати похоже выход.
Действительно можно несколько столбцов например сконвертировать в строки и склеить и получиться один столбец гарантированно уникальный. И по нем построить индекс!!!

Спасибо огромное! Очень помогли !!!
11 дек 12, 14:03    [13612578]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
dobrik
Member

Откуда: Минск
Сообщений: 210
Проверил. Всё работает таким образом. Но чтоб не упереться в ограничение длины индекса 900 байт, советую всем использовать конвертацию не в строку а в VARBINARY. (У меня длина индекса с конвертацией в VARCHAR была 1200 байт, а в VARBINARY стало 88)
:) I'm happy!!! Буду внедрять.
11 дек 12, 15:13    [13613109]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
dobrik
Проверил. Всё работает таким образом. Но чтоб не упереться в ограничение длины индекса 900 байт, советую всем использовать конвертацию не в строку а в VARBINARY. (У меня длина индекса с конвертацией в VARCHAR была 1200 байт, а в VARBINARY стало 88)
:) I'm happy!!! Буду внедрять.
Подозреваю, что уникальность слагаемых в общем случае не гарантирует уникальность суммы.
Всё зависит от того, КАК складывать.
11 дек 12, 15:23    [13613198]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
dobrik
Проверил. Всё работает таким образом. Но чтоб не упереться в ограничение длины индекса 900 байт, советую всем использовать конвертацию не в строку а в VARBINARY. (У меня длина индекса с конвертацией в VARCHAR была 1200 байт, а в VARBINARY стало 88)
:) I'm happy!!! Буду внедрять.

в свое время использовал CHECKSUM (BINARY_CHECKSUM ) (всего 4 байта), правда на большом кол-ве строк две разные строки возвращали один хэш и, поэтому, пришлось добавить к индексу помимо хэша еще пару полей, дабы обеспечить уникальность
работает до сих пор
11 дек 12, 15:43    [13613388]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
dobrik
Проверил. Всё работает таким образом. Но чтоб не упереться в ограничение длины индекса 900 байт, советую всем использовать конвертацию не в строку а в VARBINARY. (У меня длина индекса с конвертацией в VARCHAR была 1200 байт, а в VARBINARY стало 88)
:) I'm happy!!! Буду внедрять.
Ещё вариант - сделать отдельный справочник для этого ключа (для этих 17 уникальных полей). Поддерживать его периодическим подссчётом или триггерами.
11 дек 12, 15:45    [13613411]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
hpv
Member

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

А что вам мешает добавить суррогатный PK(например bigint) в таблицу TDetails и не изобретать разного рода обходные пути и велосипеды? И взять от него например MAX().

Потом у вас будет не 17 полей, а 20, 30 и т.д.
11 дек 12, 17:53    [13614644]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное вью с группировкой по 17 столбцам  [new]
dobrik
Member

Откуда: Минск
Сообщений: 210
hpv
dobrik,

А что вам мешает добавить суррогатный PK(например bigint) в таблицу TDetails и не изобретать разного рода обходные пути и велосипеды? И взять от него например MAX().

Потом у вас будет не 17 полей, а 20, 30 и т.д.


))) Так это в первую очередь и попробовал. Но нельзя ведь MAX использовать в индексированных вью ;)
11 дек 12, 18:03    [13614725]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить