Является ли таблица с большим количеством столбцов анти-шаблоном при использовании кластеризованного индекса хранения столбцов в SQL Server 2014?

Читая об индексе хранилища кластеризованных столбцов в SQL Server 2014, я задаюсь вопросом, является ли наличие таблицы с огромным количеством столбцов анти-шаблоном. В настоящее время, чтобы решить проблему наличия одной таблицы с большим количеством столбцов, я использую вертикальное разбиение, но Доступен кластерный индекс хранилища столбцов, в этом нет необходимости. Это правильно или я что-то упускаю?

Пример. Возьмем, к примеру, журнал счетчиков производительности. Необработанные данные могут иметь следующую структуру:

╔══════════════════╦═══════╦═══════╦═════╦═════╦═════╦══════════╗
║       Time       ║ Perf1 ║ Perf2 ║ ... ║ ... ║ ... ║ Perf1000 ║
╠══════════════════╬═══════╬═══════╬═════╬═════╬═════╬══════════╣
║ 2013-11-05 00:01 ║     1 ║     5 ║     ║     ║     ║        9 ║
║ 2013-11-05 00:01 ║     2 ║     9 ║     ║     ║     ║        9 ║
║ 2013-11-05 00:01 ║     3 ║     2 ║     ║     ║     ║        9 ║
║ 2013-11-05 00:01 ║     4 ║     3 ║     ║     ║     ║        9 ║
╚══════════════════╩═══════╩═══════╩═════╩═════╩═════╩══════════╝

Наличие такой таблицы с 1000 столбцов — это зло, потому что одна строка, скорее всего, будет занимать более одной страницы, потому что обычно маловероятно, что кто-то будет заинтересован во всех показателях, но запрос всегда будет нести затраты на ввод-вывод и т. д. и т. д. .. Для решения этой проблемы обычно помогает вертикальное разбиение, например, можно разделить счетчики производительности в разных таблицах по категориям (ЦП, ОЗУ и т. д.).

И наоборот, наличие такой таблицы в качестве кластеризованного индекса хранилища столбцов не должно быть такой проблемой, поскольку данные будут храниться по столбцам, а ввод-вывод для каждого запроса будет касаться только запрошенных столбцов, ничего больше независимо от общего количества столбцов в таблице.


person marcob    schedule 04.11.2013    source источник
comment
Конечно, это звучит разумно, основываясь на этом, но, вероятно, это один из тех вопросов, на которые можно ответить только путем прямого эксперимента. Меня больше беспокоит то, что мы теряем что-либо, напоминающее PK или уникальный индекс, поскольку кластеризованный индекс columnstore [i]s the only index on the table. It cannot be combined with any other indexes   -  person criticalfix    schedule 04.11.2013
comment
Один (возможно, незначительный) недостаток заключается в том, что для его создания может потребоваться больше памяти Сколько памяти необходимо для создания индекса columnstore?   -  person Martin Smith    schedule 23.02.2014


Ответы (2)


Это, конечно, менее «плохо», чем горизонтальное хранилище, но 1000 раздвигает границы слишком далеко. В нашем хранилище данных обычно есть таблицы со 100–200 столбцами, и они достаточно быстры с индексом хранилища столбцов. Предполагая, что у вас есть идеальный индекс хранилища столбцов, каждый запрос должен смотреть только на определенный вертикальный индекс и, следовательно, очень эффективен. Но если ваши индексы хранилища столбцов не оптимальны для запроса, SQL Server должен сделать некоторые переходы между индексами, а это нехорошо.

На этот счет нет эмпирического правила. Чтобы ответить на этот вопрос, вам придется провести сравнительный анализ в вашей конкретной среде.

person Code Different    schedule 04.11.2013
comment
почему 1000 много по сравнению со 100-200? учитывая структуру хранения, это не должно иметь значения. В любом случае, у меня на самом деле нет 1000 столбцов, мой вопрос был в целом о технологии, я просто хочу понять, не упускаю ли я чего-то. - person marcob; 05.11.2013
comment
Прежде всего, максимальный размер строки ограничен 8096 байтами на строку для типов данных фиксированной длины. Если ваши данные имеют переменную длину (varchar, blob и т. д.), их можно разбить на отдельные строки (см. эту тему в MSDN). Во-вторых, если у вас есть какой-либо индекс, основанный на строках, его обслуживание становится чрезвычайно трудоемким. Подумайте о том, чтобы найти нужду в стоге сена. В-третьих, вам нужно очень тщательно продумать индексы хранилища столбцов. Если вы запрашиваете два столбца в двух разных индексах, производительность будет низкой. - person Code Different; 05.11.2013
comment
Я не знаю точной настройки вашей среды, поэтому не могу предложить здесь ничего конкретного. Почему бы вам не сравнить таблицу из 1000 столбцов с двумя таблицами по 500 столбцов в каждой? - person Code Different; 05.11.2013

Тип запросов в вашей рабочей нагрузке и тип данных в вашей таблице являются факторами, которые определяют, какое хранилище строк или столбцов даст вам больше преимуществ. Если запросы ищут небольшой набор строк, rowstore может обеспечить лучшую производительность. Если запросы относятся к хранилищу данных, например, при сканировании большого объема данных, columnstore обеспечит более высокую производительность. Кроме того, вы можете создать некластеризованный индекс columnstore для своей таблицы. Оптимизатор запросов решит, когда использовать индекс columnstore, а когда — другие индексы.

Я рекомендую прочитать статью TechNet, содержащую список часто задаваемых вопросов по индексу columnstore здесь.

person Pooja Harjani    schedule 21.05.2014