Разделение SQL Server - что использовать для ключа раздела?

10

Я никогда не работал с разделами SQL Server, но в настоящее время я сталкивался с разработкой базы данных, для которой тома, вероятно, этого требуют. Система для купонов. Купоны будут выдаваться периодически, обычно каждые шесть недель, хотя будет также специальная выдача - например, для специального мероприятия. Количество клиентов составляет 15 миллионов, и для каждого события выдачи каждый клиент получит 6 различных типов купонов, что составит 90 миллионов экземпляров купона. Нам необходимо отслеживать данные о погашении экземпляра купона и сохранять их в течение 6 месяцев, хотя обычно купон действителен только в течение шести недель. Любой запрос на погашение недействительного купона не попадет в базу данных, поскольку он будет проверен POS до.

За шестимесячный период нам потребуется сохранить до 360 миллионов строк в таблице экземпляров купонов и до 72 миллионов (при условии максимальной ставки погашения 20%) в таблице погашений. У меня такое ощущение, что эти цифры слишком велики для одного раздела?

У меня вопрос - что использовать в качестве ключа раздела? Одним из очевидных кандидатов будет событие выдачи, дающее приблизительно 6 разделов. Но тогда я думаю, что, может быть, даже это даст слишком большой размер раздела, чтобы обеспечить оптимальную производительность? Можно ли разделить по двум ключам, например, по событию выдачи + последняя цифра идентификатора клиента? Таким образом, логика будет:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Кроме того, я не уверен в спецификации сервера базы данных, который нам понадобится. Хватит ли 16 ГБ и 8CPU? БД должна иметь возможность возвращать результат из таблицы экземпляров купона, введя числовое значение штрих-кода менее чем за полсекунды. Ожидаемый запрос транзакции для проверки (выбора) и выкупа (вставки), как ожидается, достигнет пика примерно 3500 в минуту.

64-битный сервер db SQL Server 2008r2 будет настроен как виртуальная машина с очень мощного хоста с доступом к высокопроизводительной и большой емкости SAN.

Я был бы очень благодарен за любые советы от тех, кто развернул решение SQL Server для управления подобными томами.

С уважением

Роб.

Роб Боуман
источник
2
Ваши таблицы все еще малы - нет необходимости в разделах, у меня есть таблица с парой миллиардов строк без разделов, работает. Хотя разделы хороши для FAST DROP.
TomTom
1
Ерунда @TomTom, разделы могут быть полезны при подсчете количества строк. Разумеется, схема разбиения должна быть полезна для шаблонов доступа, чтобы реализовать выигрыш в производительности, но общее «НЕ НУЖНО» в этом размере совершенно неверно.
Марк Стори-Смит
1
Нет, это правильно. НУЖНО! = Польза. NEED - это когда вы сталкиваетесь с проблемами при выполнении запросов без разделов.
TomTom
1
Эй, @TomTom Я думаю, что тебе нужен маленький приятель, это немного сильно, даже если на самом деле не оскорбительно. Я согласен с Марком StoreySmith, одеяло «нет необходимости» совершенно неверно, однако ваше утверждение о том, что оно, вероятно, не нужно, является правильным. Я полагаю, что это вопрос индексации. Я также знаю, что Марк знает, что вы имеете в виду под потребностью против выгоды. Немного расслабься и прекрати кофеин, к? (И поверьте мне, у меня очень мало терпения, особенно в такие дни, как сегодня, когда я
принимаю

Ответы:

14

Вопросы по спецификации сервера должны быть направлены либо на Serverfault, либо на DBA.SE.

Что касается вопроса о разделении, я не думаю, что вам обязательно нужно разделить для этого.

360 м рядов это много, но это не слишком громоздко.

Ни при каких обстоятельствах НЕ пытайтесь разделить на основе последней цифры поля. Я не уверен, что это даже сработает, но это не SARGable, который не будет надежным.

Если вам нужно только выполнить поиск по одной строке на основе числового ключа, разделение, вероятно, не поможет.

Если вы решите следовать маршруту раздела, имейте в виду, что для обеспечения эффективности все ваши запросы должны включать ваши ключи раздела, чтобы движок знал, какой раздел проверить. В противном случае он проверит их все, и вы фактически повредите производительности.

JNK
источник
2
Я согласен. Разделение SQL Server не для всех.
Ник Чаммас
Я тоже согласен. Иногда вам просто нужны лучшие индексы.
Jcolebrand
Я не согласен @JNK. Поиск в одной строке на основе числового ключа, который выигрывает от удаления разделов, уменьшает количество операций ввода-вывода. Если шаблоны доступа таковы, что часто используемые разделы остаются в пуле буферов по сравнению с редко используемыми разделами, вы получаете дополнительные преимущества в производительности. И мы даже не затронули мою любимую функцию, которую дает вам разделение, частичная доступность.
Марк Стори-Смит
Для записи, по другим вашим пунктам я полностью согласен :)
Марк Стори-Смит
@ MarkStorey-Smith - это будет зависеть от его ключа. Как в настоящее время определено в OP, раздел не будет добавлять никакого значения. Похоже, он не сможет использовать двухкомпонентный ключ с полем даты или «обычной» схемой разбиения.
JNK
5

Вы МОЖЕТЕ разбить на несколько ключей, если используете постоянный вычисляемый столбец; однако, как говорили другие, разбиение не работает для каждой ситуации. Я не уверен, что понимаю ваш сценарий достаточно, чтобы дать вам конкретный совет, но вот несколько общих рекомендаций:

  • Разделение полезно при чтении данных, когда ключ разделения является частью оператора SQL, что позволяет оптимизатору вызывать исключение разделов. Вы должны быть уверены, что выбранный вами ключ полезен для большинства запросов.

  • Одним из преимуществ хорошей стратегии разделения является устаревание данных; например, если ключ вашего раздела основан на дате (т. е. на дне года), и вы хотите удалить все данные, которые старше определенной даты, очень легко переключить эти разделы в пустую таблицу и усечь.

Стюарт Эйнсворт
источник
4

Вы действительно должны определить свои требования немного более четко. Вы упомянули, что через 6 месяцев у вас будет около 360 миллионов строк. Как насчет 2 лет? Будете ли вы продолжать расти только с той скоростью, с которой вы в настоящее время растете? Или есть шанс, что вы будете испытывать экспоненциальный рост. Вы хотите сохранить данные в этой таблице навсегда; или вы хотите архивировать данные на регулярной основе.

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

Разделение также можно использовать для управления фрагментацией индекса. Вы можете перестроить / реорганизовать отдельные разделы.

Вы должны также рассмотреть разделенные представления в противоположность разделенным таблицам. Секционированные представления не требуют лицензии SQL Server Enterprise. Секционированные представления также позволяют выполнять перестроения индексов в режиме онлайн для определенного «раздела».

Разделение также может учитываться при планировании аварийного восстановления. Может использоваться для частичного восстановления базы данных. Например: ваши старые разделы могут быть в другой файловой группе, чем основной / текущий разделы. И затем, когда вы восстанавливаете, вы восстанавливаете основную файловую группу, затем файловую группу, в которой находятся ваши текущие разделы, и, наконец, вы можете восстановить файловые группы, в которых находятся старые разделы. Это может сократить время, в течение которого ваше приложение должно быть закрыто.

Посмотрите это отличное видео от Кимберли Триппа о разделах .

Дхармендар Кумар 'DK'
источник
Нам нужно только хранить данные в течение шести месяцев. Каждую неделю мы выполняли бы служебную работу, которая удаляла бы все купоны, выпущенные более шести месяцев назад.
Роб Боуман
3
Таким образом, в основном вам придется удалять / удалять около 15 миллионов строк каждую неделю. Насколько широкий стол? Я бы посоветовал вам разбить таблицу по столбцу даты. Таким образом, еженедельное удаление будет простой мета-операцией. Вам просто нужно ВЫКЛЮЧИТЬ самый старый раздел из основной разделенной таблицы в промежуточную таблицу. Затем бросьте промежуточный стол. Это называется сценарий раздвижных окон. Посмотрите первую белую книгу, которую я написал о том, как это сделать.
Дхармендар Кумар 'DK'
-2

Если вы не делаете разбиение из-за архивирования старых данных, вы делаете это по неправильной причине и не должны этого делать.

Ryk
источник
2
Есть много причин использовать разбиение помимо архивирования; Исключение разделов очень полезно для многих типов запросов, если используется правильно.
Стюарт Эйнсворт
Я согласен со Стюартом, это несколько плохой совет.
Jcolebrand