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

Откуда:
Сообщений: 424
Никогда не работал с columnstore, прошу совета.

Есть простая таблица из четырех интов (два small) в которую по больше миллиона записей в день будут заливать.
Очень уж она хорошо жмется в columnstor формате, и предназначена для визуализации только, никаких обновлений. Сами данные обычно актуальны в районе месяца, дальше крайне редкие обращения возможны.

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

Совершенно не знаю как columnstor кешируется и вообще как с ним работает сервер.
Имеет ли смысл для того, что бы в память помещались последние несколько дней данных, допустим, партицировать её?
Какие чанки имеет смысл рассматривать?

Может быть проще не делить, но тогда она будет больше нескольких гигов в год расти. Я не админю это, но представляю геморой с большими таблицами.

Заранее спасибо за мысли
27 апр 21, 05:38    [22314848]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
uaggster
Member

Откуда:
Сообщений: 1003
1. Доступ к колоночному индексу всегда осуществляется только одним способом: он сканируется целиком (ну, или в рамках партиции, если, сервер понимает, что можно сделать исключение секций).
2. Собственно, поэтому и первоначальная "задержка" - вся таблица подбрасывается в память, если там для этого есть место. И поэтому потом - быстрее.
3. Прелесть в таком поведении, безусловно, есть, т.к. колоночный индекс сжимает хранящиеся данные раз в 8-10, при хорошем раскладе, и, например, если раньше таблица занимала 600Гб, и категорически не влезала в память, даже частями, то теперь - меньше 60 Гб, и влезает туда со свистом. Все запросы ускорились в 100 раз, и это - не фигура речи (из собственной памяти).
4. Да, партиционировать имеет смысл, если в запросах явным образом будет фигурировать ключ партиционирования, ограничивая набор секций, который будет просматриваться.
5. Иногда, партиционировать имеет смысл и по другим соображениям, прежде всего это - массовая загрузка данных в рядомстоящую таблицу, а потом включение ее в основную таблицу в виде секции. Позволяет блокировать основной поток читателей из таблицы не более чем на секунды switch partition. Причем в 2017-19 появилось еще и "ленивое переключение" - можно подождать, пока закончатся все мешающие запросы, а потом - переключиться.
6. Не делить проще, запросы компилируются быстрее, и, если исключение секций в запросе невозможно (или не бывает) - то и выполняется быстрее.
27 апр 21, 08:05    [22314872]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35081
Блог
PizzaPizza,

1) С обновлением записей там все плохо, но, если у вас не будет такой операции, то ок.
2) Предусмотрите секционирование, чтобы удалять ненужное, иначе все удаленные записи будут все равно лежать в таблице.
3) Возможно, вам придется использовать диспетчер ресурсов, иначе 4-5 запросов к такой таблице могут сожрать всю оперативку

Это из тех особенностей, что в встречал
27 апр 21, 14:37    [22315105]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
msLex
Member

Откуда:
Сообщений: 8928
uaggster
Доступ к колоночному индексу всегда осуществляется только одним способом: он сканируется целиком (ну, или в рамках партиции, если, сервер понимает, что можно сделать исключение секций).


Нет,

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

Сообщение было отредактировано: 27 апр 21, 14:43
27 апр 21, 14:51    [22315125]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
PizzaPizza
Member

Откуда:
Сообщений: 424
Спасибо всем за идеи.

Значит буду делать партиции. Выборки там как раз по ключу партиции. Осталось только определиться с размером, что бы комфортно в память влезало.

Как я понимаю никаких иных механизмов тонкой настройки этого индекса пока нет в сервере.

msLex
есть механизм segment elimination

Спасибо за наводку, погляжу на segment skipped когда буду размеры партиций подбирать.
27 апр 21, 17:45    [22315232]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
Владислав Колосов
Member

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

А зачем колоночный, может достаточно сжатия?
27 апр 21, 17:59    [22315247]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
msLex
Member

Откуда:
Сообщений: 8928
Владислав Колосов
PizzaPizza,

А зачем колоночный, может достаточно сжатия?



Columnstore очень хорошо жмет некоторые виды данных (я не про типы а про распределение)
и, судя по первому посту, это один из тех случаем

Отсутсnвуют update а удаления только секциям
Если на этих данных еще и гоняют аналитические запросы, то CS прям создан для этого кейса
27 апр 21, 19:21    [22315311]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
uaggster
Member

Откуда:
Сообщений: 1003
msLex
uaggster
Доступ к колоночному индексу всегда осуществляется только одним способом: он сканируется целиком (ну, или в рамках партиции, если, сервер понимает, что можно сделать исключение секций).


Нет,

во-первых, columnstore индекс хранится сегментами и есть механизм segment elimination

А выделенное не читаем? :-)

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

На плане, операции с колоночным индексом всегда присутствуют только в одном варианте: сканирование индекса.
Хотя, в принципе вы правы, правильнее писать: сканирование [i]колонок [/i ]индекса.
Они всегда просматриваются целиком (ну, или в рамках секции, если исключение секций - возможно).
28 апр 21, 07:45    [22315408]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
msLex
Member

Откуда:
Сообщений: 8928
uaggster
А выделенное не читаем? :-)

Вы разницу между секциями и сегментами замечаете?
28 апр 21, 09:12    [22315436]     Ответить | Цитировать Сообщить модератору
 Re: columnstore новичковый вопрос  [new]
uaggster
Member

Откуда:
Сообщений: 1003
msLex

Вы разницу между секциями и сегментами замечаете?

А. Понял. Про это
Не знал, честно говоря. Спасибо.
28 апр 21, 12:44    [22315566]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить