SQL Server Автоматическое разбиение больших таблиц базы данных - PullRequest
3 голосов
/ 28 октября 2009

Я имею дело с таблицами базы данных с десятками миллионов строк (с потенциалом перерасти в сотни миллионов со временем) и пытаюсь реализовать разбиение базы данных, чтобы попытаться сохранить стабильность производительности при увеличении числа строк. Вот что я хотел бы сделать:

Скажем, у меня есть стол, в котором хранятся животные. Одним из полей является AnimalType (то есть Bird / Fish / Cat / Dog). Мне бы хотелось, чтобы каждый AnimalType был отдельным разделом, потому что 99% запросов относятся только к одному AnimalType, и в таблице примерно одинаковое количество AnimalTypes (т.е. 1000 рыб, 1000 птиц, 1000 собак), так что это означает, что перегородки должны быть красивыми и равномерно распределенными. Тем не менее, существует много типов животных, и я не хочу вручную создавать сотни разделов для каждого AnimalType, а затем каждый раз, когда вводится новый AnimalType, приходится создавать новый раздел .

Поэтому мне бы хотелось, чтобы SQL Server разделил на основе AnimalType. Если для AnimalType уже есть раздел, используйте этот раздел, иначе SQL Server автоматически создаст новый раздел.

Звучит достаточно просто, но я не могу найти способ сделать это. Возможно ли это?

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

1 Ответ

3 голосов
/ 28 октября 2009

Разбиение - это решение проблем хранения, т.е. определить, в какой группе файлов находятся данные, основываясь на некотором значении поля. Сам по себе он не дает реального выигрыша в производительности, на самом деле он на самом деле замедляет запросы в большинстве случаев, потому что нужно добавлять новые операторы расположения разделов. Единственный способ заставить запросы учитывать только один раздел - это синтаксис $ PARTITION , который нельзя использовать в реальных сценариях приложений. Запросы, которые выбирают поиск только одного раздела, выполняются исключительно на основе диапазонов индекса и будут сканировать одинаковое количество записей с разделением или без него.

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

Преимущества производительности могут быть получены только от правильных индексов и тщательно разработанных запросов.

...