Каков наилучший способ управления большим количеством таблиц в MS SQL Server?


4

Этот вопрос связан с другим:
Will having multiple filegroups help speed up my database?

Программное обеспечение мы разрабатываем является аналитическим инструментом, который использует MS SQL Server 2005 для хранения реляционных данных. Первоначальный анализ может быть медленным (поскольку мы обрабатываем миллионы или миллиарды строк данных), но есть требования к производительности для быстрого отзыва предыдущих анализов, поэтому мы «сохраняем» результаты каждого анализа.

Наш текущий подход заключается в том, чтобы сохранить результаты анализа в серии «конкретных условий» таблиц, и анализ достаточно сложный, чтобы в итоге мы могли провести до 100 таблиц на анализ. Обычно эти таблицы используют для анализа на пару сотен МБ (что мало по сравнению с нашими сотнями ГБ или иногда несколькими ТБ исходных данных). Но в целом, дисковое пространство для нас не проблема. Каждый набор таблиц специфичен для одного анализа, и во многих случаях это дает нам огромные улучшения производительности по сравнению с исходными данными.

Этот подход начинает разрушаться, как только мы накапливаем достаточно сохраненных результатов анализа - прежде чем мы добавили более надежную возможность архивирования/очистки, наша тестовая база данных поднялась до нескольких таблиц. Но нам не нужно иметь более 100 000 таблиц, даже в производстве. Microsoft устанавливает довольно огромный теоретический предел размера sysobjects (~ 2 миллиарда), но как только наша база данных вырастет выше 100 000, простые запросы, такие как CREATE TABLE и DROP TABLE, могут резко сократиться.

У нас есть возможность обсудить наш подход, но я думаю, что это может быть трудно обойтись без большего контекста, поэтому вместо этого я хочу задать вопрос более широко: если мы вынуждены создавать так много таблиц, лучший подход для их управления? Несколько файловых групп? Несколько схем/владельцев? Несколько баз данных?

Другое примечание. Меня не волнует идея «просто бросать аппаратное обеспечение в проблему» (например, добавление ОЗУ, мощности процессора, скорости диска). Но мы не будем это исключать, особенно если (например) кто-то может сказать нам окончательно, какой эффект добавляет ОЗУ или использование нескольких файловых групп для управления большим системным каталогом.

  0

WOW. С помощью многих таблиц, что делает Management Studio при загрузке списка? Это должно быть болезненно. 23 сен. 082008-09-23 23:38:19

  0

Мы не смеем позволить Management Studio вывести список таблиц. Каждый раз, когда кто-то делает это непреднамеренно, либо они должны убить процесс, либо просто сбой. Но это далеко от нашей самой большой проблемы. 30 дек. 082008-12-30 14:49:17

  0

Мне любопытно, как это получилось для вас, похоже, это область, где почти никто не имеет достоверной информации о том, как это сделать, и это вся теория. Поэтому любые ответы были бы полезными. 16 авг. 112011-08-16 06:58:58

0

Мы закончили разделение нашей базы данных на несколько баз данных. Таким образом, основная база данных содержит таблицу «базы данных», которая ссылается на одну или несколько «запущенных» баз данных, каждая из которых содержит различные наборы результатов анализа. Затем основная таблица «run» содержит идентификатор базы данных, а код, который извлекает сохраненный результат, включает в себя соответствующий префикс базы данных по всем запросам.

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

Мы также заметили, что SQL 2008 имеет тенденцию обрабатывать большие системные каталоги лучше, чем SQL 2000 и SQL 2005. (Мы не обновлялись до 2008 года, когда я разместил этот вопрос.)


0

Это, кажется, очень интересная проблема/приложение, с которым вы работаете. Я хотел бы работать над чем-то подобным. :)

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

Вам понадобится комбинация серьезных хранилищ данных и разбиения данных/таблиц. В зависимости от того, сколько данных вы хотите сохранить и архивировать, вам может потребоваться начать нормализацию и сглаживание таблиц.

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


1

Являются ли таблицы различными конструкциями? Если они имеют одинаковую структуру, вы можете уйти с одной секционированной таблицей.

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

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


2

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

Другая возможность его ставить каждый прогон в своей базе данных, а затем отделить их, только прикрепление их по мере необходимости (в форме только для чтения)

CREATE TABLE и DROP TABLE, вероятно, работает плохо, потому что хозяин или модельные базы данных не оптимизированы для такого поведения.

Я также рекомендую поговорить с Microsoft о вашем выборе дизайна базы данных.