powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Партицирование с возможностью убрать партицию в архив
25 сообщений из 51, страница 2 из 3
Партицирование с возможностью убрать партицию в архив
    #39959533
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Весь скрипт:
Код: sql
1.
delete top(nnn) ...



Делал так на несекционированных логах, когда их по чуть-чуть переносил в архив. Работало вполне нормально на довольно большом объеме. Но у меня операция выполнялось редко и только во время минимальной активности пользователей.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #39959635
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
но как я понимаю bcp индексы не сохраняет потом их ребилдить отдельно - неудобно, но решаемо
Я же в секции загружал. Как описал выше.
То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию.

Критик
Делал так на несекционированных логах, когда их по чуть-чуть переносил в архив. Работало вполне нормально на довольно большом объеме.
Определение "большой объём" - это когда удаление данных за сутки начинает превышать сутки :-)

А так то да, если можно просто удалить, чего зря городить код?
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #39959839
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
selis76
но как я понимаю bcp индексы не сохраняет потом их ребилдить отдельно - неудобно, но решаемо
Я же в секции загружал. Как описал выше.
То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию.
.... ?

А как боролись с объемом файлов данных которые порождает BCP - ? клали в папки типа Compressed folders?
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #39959847
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
alexeyvg
пропущено...
Я же в секции загружал. Как описал выше.
То есть bcp в таблицу-кучу, потом строю кластерный индекс, потом переключаю секцию.
.... ?

А как боролись с объемом файлов данных которые порождает BCP - ? клали в папки типа Compressed folders?
Надо было, но как то не заморачивался :-) На суточную порцию места хватало.
Потом, перед копированием, коненчно, сжимал.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #39960547
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно, а так - будет работать:
1. Создаем таблицу в другой БД.
2. Создаем к ней алиас в основной БД
3. Переименовываем таблицу в основной базе.
4. Создаем view в основной базе, и называем его как таблицу в основной базе:
Select * from таблица_в_основной_базе
Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_основной_таблице
union all
Select * from алиас
Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_архивной_таблице

И в дальнейшем везде оперируем только view.
Ну и, собственно, загрузка старых данных - это bcp в рядомстоящую таблицу в архивной базе, а потом alter table switch.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #39960603
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Интересно, а так - будет работать:
1. Создаем таблицу в другой БД.
2. Создаем к ней алиас в основной БД
3. Переименовываем таблицу в основной базе.
4. Создаем view в основной базе, и называем его как таблицу в основной базе:
Select * from таблица_в_основной_базе
Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_основной_таблице
union all
Select * from алиас
Where ключ_по_которому_разрезана_таблица between всё_что_относится_к_архивной_таблице

И в дальнейшем везде оперируем только view.
Ну и, собственно, загрузка старых данных - это bcp в рядомстоящую таблицу в архивной базе, а потом alter table switch.
Да, конечно.
Сиквел на это специально рассчитан, такая вьюха называется "Секционированное представление" (на разных серверах "Распределённое секционированное представление"), и сервер оптимизирует обращения к отдельным его "частям".

После появления секционирования этим представлениям стали меньше уделять внимания, но раньше это был единственный способ секционирования.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054555
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста способы наиболее эффективного бэкапа для партицированных таблиц, которые используют файловые группы в циклическом режиме
Т.е. заниматься частым архивированием только активной партиции
+ иметь возможность truncate данные одной партиции и восстановить ее без манипуляций со switch
Из
https://docs.microsoft.com/ru-ru/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver15

https://blog.coeo.com/five-cool-things-you-can-do-using-partitioning

Я понял что можно переводить в режим read only только файловые группы и архивировать именно файловые группы, но я не вижу команд для архивирования просто партиций . Просто при циклическом переключении файловых групп неудобно их переводить в Read only и обратно (нужно следить скриптом)
SQL Server 2019
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054578
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
Подскажите пожалуйста способы наиболее эффективного бэкапа для партицированных таблиц, которые используют файловые группы в циклическом режиме
Т.е. заниматься частым архивированием только активной партиции
...
Я понял что можно переводить в режим read only только файловые группы и архивировать именно файловые группы, но я не вижу команд для архивирования просто партиций . Просто при циклическом переключении файловых групп неудобно их переводить в Read only и обратно (нужно следить скриптом)
SQL Server 2019
Под архивированием вы подразумеваете бакап?
Без отдельных файловых групп никак.
Сиквел не имеет функциональности (как и любые другие СУБД) делать бакап и рестор отдельных секторов в файле базы данных.
selis76
+ иметь возможность truncate данные одной партиции и восстановить ее без манипуляций со switch
"Транкейт партиции без манипуляций со switch" по моему появился в последних версиях.
"Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД, как я уже говорил.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054581
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

"Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД , как я уже говорил.

для полноты картины, можно восстанавливать страницы файла
Код: sql
1.
RESTORE DATABASE { database_name }   PAGE = 'file:page [ ,...n ]'...
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054587
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
alexeyvg"Восстановить" нельзя, т.к. нельзя бакапить и рестроить отдельные сектора в файле БД , как я уже говорил.

для полноты картины, можно восстанавливать страницы файлаНе, ну это ковыряние ручками, а не бакап-рестор.
Тут команда называется "RESTORE DATABASE", да, но при этом но не является рестором базы (или её части) из бакапа...
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054637
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

Под архивированием вы подразумеваете бакап?
Без отдельных файловых групп никак.

Да именно бэкап. База является буфером который наполняется последовательно , и поэтому хотелось сократить время резервного копирования + иметь возможность оперативно убирать \восстанавливать старые партиции.
Но видимо придется делать обычную схему - полный бэкап раз в неделю + инкрементальный + дневной бэкап логов.
А с архивными партициями управляться через BCP , конечно неудобно что в MS SQL нет удобного механизма подключения и отключения архивных партиций а только через BCP + Switch .
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054649
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

подумайте над архитектурой вашего ПО, к примеру, если уйти от хранения xml в СУБД, то и куча ваших проблем также исчезнет
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054651
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

наиболее эффективный путь - это перенос "секций" в отдельную базу + секционированное представление.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40054787
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
alexeyvg

Под архивированием вы подразумеваете бакап?
Без отдельных файловых групп никак.

Да именно бэкап. База является буфером который наполняется последовательно , и поэтому хотелось сократить время резервного копирования + иметь возможность оперативно убирать \восстанавливать старые партиции.
Но видимо придется делать обычную схему - полный бэкап раз в неделю + инкрементальный + дневной бэкап логов.
А с архивными партициями управляться через BCP , конечно неудобно что в MS SQL нет удобного механизма подключения и отключения архивных партиций а только через BCP + Switch .


посмотрите тут Partial Backups
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40073971
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо сказать switch это еще то приключение даже если делаешь таблицы как копия метаданных
switch out проходит норм , а для switch in приходится городить констрейнт

ALTER TABLE [dbo].[msg_buffer_temp] ADD CONSTRAINT Range_msg_buffer_temp CHECK (MsgCounter>2560000000 AND MsgCounter<=2590000000);
иначе MS SQL выдает ошибку "allow values that are not allowed by range defined by partition"

Т.е. получается что партицирование как инструмент удобного перевода исторических данных в архив и обратно (по партициям) не такое уж и удобное.
1) Alter table switch работает только в рамках одной файловой группы в другую базу его не сделаешь
2) Бэкап, truncate , восстановление нужной партиции можно сделать только через BCP - долго
3) Бэкап\восстановление отдельных партиций через файловые группы можно делать только если она в read -only, т.е последующий транкейт не сделаешь.

Т.е. с одной стороны куча контролей по констрейнтам, а с другой узкие возможности по переносу данных.


Получается если чтото историческое хочешь отправить в архив проще
1) Сделать архив базы buffer
2) Затранкейтить ненужные партиции
Если понадобится восстановить отдельную партицию
3) При необходимости восстановить его в том же Instance SQL под именем buffer_backup
4) Далее через insert перенести данные в нижний диапазон. Хорошо что insert почти не раздувает transaction log
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40073978
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
для switch in приходится городить констрейнт
Да, это в МС не доделали, конечно.
Но всё равно же быстрее, чем вставка/удаление обычными insert delete.

selis76
Получается если чтото историческое хочешь отправить в архив проще
Отличный вариант - секционированные представления и много баз (эмуляций секций).
Намного производительней, проще, гибче, и надёжней. Притом всё это несравнимо, не "чуть чуть"
Но с партициями тоже можно кое как работать, если приноровиться.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40073984
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

зачем гонять из архива секции, я выше написал магические слова - "секционированное представление". Достаточно изменить представление, чтобы архив стал доступен. Читаете, но не видите... И Алексей об этом же пишет.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40074379
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
selis76,

зачем гонять из архива секции, я выше написал магические слова - "секционированное представление". Достаточно изменить представление, чтобы архив стал доступен. Читаете, но не видите... И Алексей об этом же пишет.


Я читал про секционированное представление, но для себя решил пока его не использовать по 3м причинам
1) Чтобы соединить два набора данных (архивная + актуальная таблицы) и это будет View с union причем таблиц из разных баз одного инстанса . Т.е. для оптимизатора это будут по сути разные таблицы с разными индесами (даже если там все логически одинаково) и он наверняка будет всегда делать поиск по обоим всегда.
2) Мне может понадобится восстановить более чем один диапазон из архива из разных бэкапов.
3) У меня много запросов с разными комбинациями условий и join + чтобы избежать обращения ко всем партициям (известная особенность) приходится везде ставить условие на основное поле партицированного индекса MsgCounter.

Учитывая это решил, что заставлять оптимизатор Microsoft работать правильно сложнее чем загнать архивные данные через insert если нужно.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40074383
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

а что мешает вам сделать два представления, для архива и для текущей базы? А уже потом соединят их результаты так или иначе.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40074409
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

Похожая проблема на oltp базе.

Пока что делаю топорно пару раз в год:

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

- переименовываю обе, чтобы вставки шли в новую

- копирую старую в архив и удаляю

Это работает, так как данные в этих таблицах не меняются.

Партиционированные виды не применяю, т.к. не выполнить условие по PK.

Партиционированные таблицы (скользящее оконо) не применяю, так как:
таблица периодически меняется, в случае ошибки с организацией скользящего окна ляжет приложение
т.е. что бы что то изменить, нужен человек с опытом, нужно тестировать - т.е. затраты времени на небольшую сервисную функцию.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40074478
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
1) Чтобы соединить два набора данных (архивная + актуальная таблицы) и это будет View с union причем таблиц из разных баз одного инстанса . Т.е. для оптимизатора это будут по сути разные таблицы с разными индесами (даже если там все логически одинаково) и он наверняка будет всегда делать поиск по обоим всегда
Всё правильно вы описали, то есть всё будет работать так же, как для секционированной таблицы.
selis76
2) Мне может понадобится восстановить более чем один диапазон из архива из разных бэкапов.
Вы неправильно поняли.
Вы можете иметь произвольное количество архивных копий, и подсоединять их, модифицируя само представление. Можете включить один архив в представление/ можете все сразу, варианты ограничены только вашей фантазией и железом.

Например, у вас есть база с транзакциями за активный период, и базы за прошедшие месяцы.
Архивные базы хранятся на ленте.
Вы копируете с ленты баз за феврали с 2001 по 2010 год, потом оп - за 1 мс меняется представление ,у вас доступны активный период, плюс феврали за 10 лет.

С секционировнаной таблицей для того же самого нужно будет дополнительно восстанавливать бакапы, плюс делать чек констрэйн. Присоединять секции снаружи там нельзя, чек-констрейн оно тоже почему то не сохраняет при отоединении.
selis76
Учитывая это решил, что заставлять оптимизатор Microsoft работать правильно сложнее чем загнать архивные данные через insert если нужно.
А вы пробовали? По моему, он однаково работает с секционированными представлениями и таблицами. Если может, обращается к одной секции (таблице), если не может, то ко всем
Кроме того, не преувеличивайте негативные последствия обращения ко всем секциям, там накладные расходы проявляются только для огромного потока сверх-лёгких обращений.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40074650
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

я правильно понял, что вы предлагает менять код на проде в онлайн режиме, так сказать? Это универсальный совет или только для случая ленточных баз? С ними я дела не имел, поэтому специфики не знаю. Мы на лентах только бекапы хранили, и то это было 15 лет назад.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40077236
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один подводный камень с партициями.
Нужно сделать массовую загрузку данных в несколько свободных партиций, а для этого нужно отключить все индексы кроме кластреного (для скорости)
И вот что получается - ребилд по партициям можно сделать , а Disable уже нет только для всего индекса
https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15

У microsoft формально есть решение с 2005 года, типа грузите в стейдж таблицу, там ребилд индексов а далее переключите ее в партицию
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2005/administrator/cc966380(v=technet.10)
т.е. если еще нужно констрейнты по диапазонам ставить то уже эта акробатика напрягает. Вроде бы партиции специально придумали для изолированной работы с партициями , но по факту без stage таблиц ничего не живет. Сразу захотелось поизучать как дела у Oracle с этим, по опыту использования там всегда продуманней механизмы были
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40077309
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
Это универсальный совет или только для случая ленточных баз?
Это совет для тех случаев, когда использование секционирования не помогает решить задачу, а секционированные представления помогают. Только лишь совет не забывать про секционированные представления.
...
Рейтинг: 0 / 0
Партицирование с возможностью убрать партицию в архив
    #40077345
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76,

Вообще-то все "некурильщики" загружают в отдельные пустые таблицы, которые потом получают нужные индексы и переключаются в основную таблицу. Если лень пересоздавать кластерный индекс, то можно направить в таблицу уже отсортированный поток
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Партицирование с возможностью убрать партицию в архив
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]