|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
День добрый. Подскажите, как будет лучше сделать следующее. Есть довольно много данных 5-6Тб разделенных в файлы помесячно. Их нужно "залить" в две таблицы БД, по одной предварительно построив ClusterdColumnStore индекс (для сжатия данных) ну и потом по некоторым полям построить обычные индексы. БД будет использоваться исключительно для чтения ну и "доливки" новых данных каждый месяц... Заливать весь объем в одиночные таблицы что-то не хочется, т.к. может понадобится заменить какой-нибудь месяц в середине, ну а delete, как я понимаю с такими объемами не справится да и размер .mdf-файла получается огромным. Есть две идеи. 1. Сделать много "маленьких" БД куда заливать данные по месяцу, ну и строить индексы и сделать одну БД в которой сделать два View в котором через union all объединять соответствующие таблицы из этих "маленьких" баз. 2. Заливать в одну БД в разные таблицы, которые каждая в своей файловой группе (ну и в отдельном файле) и потом объединить все их секционированием. Так собственно вопрос какой из подходов лучше/оптимальнее с точки зрения логики, скорости работы (может есть какие-нибудь нюансы с индексами) и пр. Или вообще всё не так и нужно делать всё по другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2021, 20:36 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
разбивая по разным базам у тебя будут разные права на разных базах. Секционирование в этом случае проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2021, 20:42 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
Badhabit, Я не очень понял вот это: автор2. Заливать в одну БД в разные таблицы, которые каждая в своей файловой группе (ну и в отдельном файле) и потом объединить все их секционированием. Секционирование это, строго говоря, разделение данных, что ты собрался объединять? Или имеется ввиду загрузка данных в heap таблицы с последующим переключением в заранее созданную секционированную таблицу? Если время загрузки ограничено, то это вполне подходящий вариант, ты можешь грузить данные в несколько таблиц одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2021, 20:51 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
Badhabit, если потребуется перезагрузить какой-то период полностью, то секционирование по этому периоду. Секции можно переключать через alter table. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2021, 22:24 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
авторразбивая по разным базам у тебя будут разные права на разных базах. Наверно с правами проблем не будет, БД вообще на локальном компе и работаю из под sa и права сам все назначаю... Или какие-то другие права? авторсекционирование это, строго говоря, разделение данных, что ты собрался объединять? Или имеется ввиду загрузка данных в heap таблицы с последующим переключением в заранее созданную секционированную таблицу? Если время загрузки ограничено, то это вполне подходящий вариант, ты можешь грузить данные в несколько таблиц одновременно. Да, имелось ввиду подключение закруженных месяцев в заранее созданную секционированную таблицу... Ну в принципе я хотел узнать есть ли преимущество у секций перед View с union all из разных БД? Потому что мне как-то комфортнее работать именно с несколькими маленькими ДБ, чем с секционированными таблицами в одной БД. Только не будет ли каких-нибудь просадок в производительности при данном выборе? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2021, 12:30 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
Badhabit, есть только один способ узнать. Я не замечал, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2021, 13:15 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
Badhabit День добрый. Подскажите, как будет лучше сделать следующее. Есть довольно много данных 5-6Тб разделенных в файлы помесячно. Их нужно "залить" в две таблицы БД, по одной предварительно построив ClusterdColumnStore индекс (для сжатия данных) ну и потом по некоторым полям построить обычные индексы. БД будет использоваться исключительно для чтения ну и "доливки" новых данных каждый месяц... Заливать весь объем в одиночные таблицы что-то не хочется, т.к. может понадобится заменить какой-нибудь месяц в середине, ну а delete, как я понимаю с такими объемами не справится да и размер .mdf-файла получается огромным. Есть две идеи. 1. Сделать много "маленьких" БД куда заливать данные по месяцу, ну и строить индексы и сделать одну БД в которой сделать два View в котором через union all объединять соответствующие таблицы из этих "маленьких" баз. 2. Заливать в одну БД в разные таблицы, которые каждая в своей файловой группе (ну и в отдельном файле) и потом объединить все их секционированием. Так собственно вопрос какой из подходов лучше/оптимальнее с точки зрения логики, скорости работы (может есть какие-нибудь нюансы с индексами) и пр. Или вообще всё не так и нужно делать всё по другому? Это классическая задача под секционирование. У меня, например, аналогичная задача. Сводная БД, куда (пере)загружаются данные разных филиалов помесячно. Таблицы поделены на, примерно, 6000 секций, с ключом по id филиала + месяц. Заливка происходит в динамически создаваемые создаваемые таблицы в отдельной схеме, а потом секция подменяется через partition switch. С учетом того, что данные льются не в основную структуру, чтение данных из основной структуры - практически не блокируется. Практически, потому что partition switch приводит к аварийному завершению запроса, если он работает на момент переключения секций. Но, к счастью, в 2019 появилось ленивое переключение. Оно сначала ждет задаваемый в команде таймаут, а потом - переключает. Да! Дозагрузка реализована несколько уродски. :-) В автономные таблицы заливаются новые данные, а потом туда же - ранее загруженные данные из продуктовой таблицы. Потом в этой таблице строятся индексы, а потом - секция переключается. Могу сказать, что не смотря на постоянную заливку данных 24Х7 в 8 потоков, по продуктовым таблицам вполне можно строить оперативные отчеты. Сложные агрегаты, конечно, считаются в кубе, который строится на базе, восстановленной из бэкапа раз в сутки. Объем всего этого дела не очень большой, чуть менее 10 Тб, но, думаю, потенциал у нее где то до 20-30 Тб дорасти, судя по нагрузке, откликам и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2021, 13:19 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
авторесть только один способ узнать. Я не замечал, например. Понял, потестирую... Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2021, 13:19 |
|
Как правильно разбить большую БД на части/файлы?
|
|||
---|---|---|---|
#18+
Владислав Колосов Badhabit, если потребуется перезагрузить какой-то период полностью, то секционирование по этому периоду. Секции можно переключать через alter table. По моему опыту altertable с целью разбить партиции на части виснет замертво. Всегда создавал и подменял таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2021, 18:17 |
|
|
start [/forum/topic.php?fid=46&msg=40094796&tid=1684340]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 545ms |
0 / 0 |