powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Секционирование в целях архивирования постоянно устаревающих данных
20 сообщений из 20, страница 1 из 1
Секционирование в целях архивирования постоянно устаревающих данных
    #39962374
Leo Лапыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть большая таблица, в которую постоянно добавляются данные, данные за последнюю неделю могут модифицироваться, остальные лежат уже без изменений и используются только в отчётах.
Нужно сделать так, чтобы данные за последнюю неделю хранились в одном файле, а архивные - в другом. Причём каждый день неделя передвигается на день вперёд.

Я сделал через три файловых группы и функцию секционирования по следующим правилам:
1) от сотворения мира до неделю назад;
2) от неделю назад до завтра;
3) от завтра до конца света.

Проблема в том, что даты забиваются жёстко, и завтра уже этот план будет работать не так, как задумывался.
Я "решил" эту проблему через ежедневную модификацию функции секционирования весьма извращённым на мой взгляд способом:
1. Удаляю из функции секционирования секцию 2), объединяя её с секцией 1).
2. Добавляю к функции секционирования удалённую секцию 2), с границей неделя назад (теперь от текущего дня).
3. Удаляю из функции секционирования секцию 3), объединяя её с секцией 2).
4. Добавляю к функции секционирования удалённую секцию 3), с границей завтра (теперь от текущего дня).

И мне кажется, что всё это будет жутко медленно работать (если вообще будет).
Внимание, вопрос: а как это сделать правильно?

Спасибо за ответы!
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962391
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч,

для чего вам именно секции? Создайте несколько таблиц и представление или табличную функцию для просмотра.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962410
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если очень хочется секционировать, то можно вместо даты добавить битовое поле "архив", секционировать по этому полю и обновлять его по расписанию заданным алгоритмом. Но с таблицами еще лучше - архивную таблицу можно поместить в отдельную базу и создать секционированное представление с использованием того же архивного бита. Для выбора таблицы в запросе можно использовать функцию, вычисляющую признак архивности.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962467
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leo Лапыч
Есть большая таблица, в которую постоянно добавляются данные, данные за последнюю неделю могут модифицироваться, остальные лежат уже без изменений и используются только в отчётах.
Нужно сделать так, чтобы данные за последнюю неделю хранились в одном файле, а архивные - в другом. Причём каждый день неделя передвигается на день вперёд.

Я сделал через три файловых группы и функцию секционирования по следующим правилам:
1) от сотворения мира до неделю назад;
2) от неделю назад до завтра;
3) от завтра до конца света.

Проблема в том, что даты забиваются жёстко, и завтра уже этот план будет работать не так, как задумывался.
Я "решил" эту проблему через ежедневную модификацию функции секционирования весьма извращённым на мой взгляд способом:
1. Удаляю из функции секционирования секцию 2), объединяя её с секцией 1).
2. Добавляю к функции секционирования удалённую секцию 2), с границей неделя назад (теперь от текущего дня).
3. Удаляю из функции секционирования секцию 3), объединяя её с секцией 2).
4. Добавляю к функции секционирования удалённую секцию 3), с границей завтра (теперь от текущего дня).

И мне кажется, что всё это будет жутко медленно работать (если вообще будет).
Внимание, вопрос: а как это сделать правильно?

Спасибо за ответы!


не совсем понятно, почему нельзя вычислять все даты относительно системной даты (т.е. текущего дня)? Берешь getdate() и пляшешь от нее. т.е. 1) Date < dateadd(day,getdate(),-7); 2) date between dateadd(day,getdate(),-7) and dateadd(day,getdate(),1); 3) date>dateadd(day,getdate(),1)

ну, и если так хочется, то можно все это оформить в виде Job, который будет запускаться в 00:00 и перетягивать соответствующие дневные -7 данные из оперативной таблицы в архивную, удаляя их из оперативной таблицы
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962481
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так, сбили файловые группы :)
неправильно понял задачу.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962519
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ежедневно это наверное слишком часто
Я бы это делал раз в неделю и держал бы еще пару партиций "две недели назад" и "неделю вперед"
То есть вместо трех партиций "архив", "текущая", "будуще" сделал бы пять: "архив", "еще не архив, но никакой активности", "текущая", "пока пустая, но уже готовлюсь" , "будущее"
Тогда раз в неделю разбивал бы партицию "будущее" на "будущее" и "неделю вперед" и объединял бы партицию "архив" и "две недели назад".
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962657
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч


Я сделал через три файловых группы и функцию секционирования по следующим правилам:
1) от сотворения мира до неделю назад;
2) от неделю назад до завтра;
3) от завтра до конца света.


Это не самая хорошая идея. Лучше сделайте партиционирование по месяцам и отгоняйте партицию в другую таблицу.

К тому же такого секционирования, как вы описали, вы не сделаете.

Вот наступает 24:00 и "сегодня" превращается во "вчера", а "7 дней назад" в "8 дней назад". Внимание вопрос, что на физическом уровне у вас должно случиться с данными? Если вы говорите о разных файлах, то у вас должно начаться крупное копирование данных, а не просто switch partition.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962664
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
Нужно сделать так, чтобы данные за последнюю неделю хранились в одном файле, а архивные - в другом. Причём каждый день неделя передвигается на день вперёд.
Каждый день копировать данные за сутки из одного файла в другой - ИМХО не самая лучшая идея.

Если цель - размещение архивных данных на медленном, но недорогом, хранилище, то лучше делать суточные секции, и перемещать ежедневно соответствующий файл.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962757
Leo Лапыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Leo Лапыч,
для чего вам именно секции? Создайте несколько таблиц и представление или табличную функцию для просмотра.
Всё дело в том, что с этой базой данных работает некоторая система, а лезть в неё и что-то менять категорически не желательно.
Владислав Колосов
Если очень хочется секционировать, то можно вместо даты добавить битовое поле "архив", секционировать по этому полю и обновлять его по расписанию заданным алгоритмом. Но с таблицами еще лучше - архивную таблицу можно поместить в отдельную базу и создать секционированное представление с использованием того же архивного бита. Для выбора таблицы в запросе можно использовать функцию, вычисляющую признак архивности.
Такая мысль пришла мне уже после публикации поста - по материализованному вычисляемому полю. Но как это будет работать? При обновлении значения поля записи сразу копируются из файла в файл? Если я сделаю поле, вычисляемое на основе поля типа даты (создания записи), как это будет работать? Материализованное вычисляемое поле вроде бы перевычисляется только при обновлении участвующих в вычислении полей, или я ошибаюсь? Тогда, наверное, в вычисляемом поле смысла большого нет и можно использовать обычное.
godsql
не совсем понятно, почему нельзя вычислять все даты относительно системной даты (т.е. текущего дня)? Берешь getdate() и пляшешь от нее. т.е. 1) Date < dateadd(day,getdate(),-7); 2) date between dateadd(day,getdate(),-7) and dateadd(day,getdate(),1); 3) date>dateadd(day,getdate(),1)
А разве можно в функции секционирования использовать функции (тем более недетерминированные)?
godsql
ну, и если так хочется, то можно все это оформить в виде Job, который будет запускаться в 00:00 и перетягивать соответствующие дневные -7 данные из оперативной таблицы в архивную, удаляя их из оперативной таблицы
Про разные таблицы - не вариант. Если только делать две новые таблицы, а существующую удалять и создавать вместо неё обновляемое представление. Тут я предвижу проблемы, поэтому менять таблицу на представление не буду.
SERG1257
ну ежедневно это наверное слишком часто
Я бы это делал раз в неделю и держал бы еще пару партиций "две недели назад" и "неделю вперед"
То есть вместо трех партиций "архив", "текущая", "будуще" сделал бы пять: "архив", "еще не архив, но никакой активности", "текущая", "пока пустая, но уже готовлюсь" , "будущее"
Тогда раз в неделю разбивал бы партицию "будущее" на "будущее" и "неделю вперед" и объединял бы партицию "архив" и "две недели назад".
Спасибо, учту. Я третий день только в это секционирование погружаюсь, так что пока каша в голове только заваривается.
a_voronin
Это не самая хорошая идея. Лучше сделайте партиционирование по месяцам и отгоняйте партицию в другую таблицу.
Месяц слишком много, максимум две недели.
a_voronin
К тому же такого секционирования, как вы описали, вы не сделаете.
Вот наступает 24:00 и "сегодня" превращается во "вчера", а "7 дней назад" в "8 дней назад". Внимание вопрос, что на физическом уровне у вас должно случиться с данными? Если вы говорите о разных файлах, то у вас должно начаться крупное копирование данных, а не просто switch partition.
Я это понимаю, поэтому и спросил как правильно.
alexeyvg
Каждый день копировать данные за сутки из одного файла в другой - ИМХО не самая лучшая идея.
Если цель - размещение архивных данных на медленном, но недорогом, хранилище, то лучше делать суточные секции, и перемещать ежедневно соответствующий файл.
В дела администрирования сервера я не лезу. Суть задачи дать оперативным операторам DML работать только с оперативными данными (и индексами), а архивным - с оперативными и архивными. Цель - уменьшение времени оперативных запросов, пускай и за счёт увеличения времени архивных. Сейчас данные за два месяца в этой таблице приводят к резкому спаду производительности, вплоть до отказов в ответах на запросы по таймауту.

Всем спасибо за ответы! Хотелось бы больше конкретики: не только "что", но и "как".
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962777
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
Суть задачи дать оперативным операторам DML работать только с оперативными данными (и индексами), а архивным - с оперативными и архивными. Цель - уменьшение времени оперативных запросов, пускай и за счёт увеличения времени архивных. Сейчас данные за два месяца в этой таблице приводят к резкому спаду производительности, вплоть до отказов в ответах на запросы по таймауту.
А, так вы не в медленное хранилище перемещаете?

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

Leo Лапыч
Всем спасибо за ответы! Хотелось бы больше конкретики: не только "что", но и "как".
Ну вот, предложили конкретное решение:

Leo Лапыч
Владислав Колосов
Если очень хочется секционировать, то можно вместо даты добавить битовое поле "архив", секционировать по этому полю и обновлять его по расписанию заданным алгоритмом. Но с таблицами еще лучше - архивную таблицу можно поместить в отдельную базу и создать секционированное представление с использованием того же архивного бита. Для выбора таблицы в запросе можно использовать функцию, вычисляющую признак архивности.
Такая мысль пришла мне уже после публикации поста - по материализованному вычисляемому полю. Но как это будет работать? При обновлении значения поля записи сразу копируются из файла в файл? Если я сделаю поле, вычисляемое на основе поля типа даты (создания записи), как это будет работать? Материализованное вычисляемое поле вроде бы перевычисляется только при обновлении участвующих в вычислении полей, или я ошибаюсь? Тогда, наверное, в вычисляемом поле смысла большого нет и можно использовать обычное.
Да, можно сделать обычное поле.
Да, при обновлении записи будут перемещаться из файла в файл.

И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???)
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39962861
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч,

Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос.

В архив (или другую файловую группу) перегоняется раз год руками.

Всякий раз, когда начинали говорить о скользящей дате архивации, либо возникал геморрой, либо после долгой болтовни про эту идею забывали.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39963331
Leo Лапыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
А, так вы не в медленное хранилище перемещаете?
Тогда нужно сделать так, что бы запросы работали с большой таблицей с такой же скоростью, как и с маленькой. Это несложно, это как бы получается само собой, если в модели и запросах нет косяков.
В том-то и дело, что они есть.
alexeyvg
Да, можно сделать обычное поле.
Да, при обновлении записи будут перемещаться из файла в файл.
И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???)
А с чего она упадёт, если обновлять поле, на которое завязана схема секционирования, по регламенту раз в сутки, например?
a_voronin
Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос.
В архив (или другую файловую группу) перегоняется раз год руками.
Да, такой подход встречал, но у меня дискретность одна неделя, не хотелось бы сотни файлов иметь.
a_voronin
Всякий раз, когда начинали говорить о скользящей дате архивации, либо возникал геморрой, либо после долгой болтовни про эту идею забывали.
Тут не скользящее окно, по крайней мере в его классическом виде с копией структуры секционируемой таблицы (stage) для переключения секции. А вопрос о секционировании очередной раз встал, и хочется попробовать и посмотреть на результат.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39963344
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
alexeyvg
Да, можно сделать обычное поле.
Да, при обновлении записи будут перемещаться из файла в файл.
И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???)
А с чего она упадёт, если обновлять поле, на которое завязана схема секционирования, по регламенту раз в сутки, например?
С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование.

С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции.
А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса).
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39963347
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
А вопрос о секционировании очередной раз встал, и хочется попробовать и посмотреть на результат.
Попробовать то легко. Разделите таблицу на 2 секции, по флажку "архив" (который проставите по диапазону дат), и посмотрите, ускорятся запросы, или нет.
Пока не касаясь механизмов переноса в архивную секцию, для оценки производительности это несущественно.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39963352
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч

a_voronin
Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос.
В архив (или другую файловую группу) перегоняется раз год руками.
Да, такой подход встречал, но у меня дискретность одна неделя, не хотелось бы сотни файлов иметь.


А причем тут сотни файлов. Сотни партиций не подразумевают сотни файлов.

Партиционирование по неделям (лучше неделям ISO) вполне имеет право на существование. Лишь бы лимит партиций не кончился == 15000.

Просто не надо двигать границы уже заполненных партиций. Вот это гемор.

Можно сделать партиционирование по (год-неделя, архив-не-архив).

Архив в одну файловую группу, не архив в другую класть. Недельную порцию данных переливать (не через UPDATE, а через SELECT INSERT - TRUNCATE PARTITION)
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39964000
Leo Лапыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование.
С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции.
А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса).
Если к полному скану таблицы, согласен, что не спасёт. Но если всё-таки
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39964007
Leo Лапыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование.
С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции.
А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса).
Если к полному скану таблицы, согласен, что не спасёт. А как вообще поступают, если надо побороть тормоза на больших таблицах, не вдаваясь в поступающие к ним запросы, их планы и т.п.?
a_voronin
А причем тут сотни файлов. Сотни партиций не подразумевают сотни файлов.
Партиционирование по неделям (лучше неделям ISO) вполне имеет право на существование. Лишь бы лимит партиций не кончился == 15000.
Просто не надо двигать границы уже заполненных партиций. Вот это гемор.
Можно сделать партиционирование по (год-неделя, архив-не-архив).
Архив в одну файловую группу, не архив в другую класть. Недельную порцию данных переливать (не через UPDATE, а через SELECT INSERT - TRUNCATE PARTITION)
А можно больше конкретики, по шагам как это делается?
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39964010
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo ЛапычА как вообще поступают, если надо побороть тормоза на больших таблицах, не вдаваясь в поступающие к ним запросы, их планы и т.п.?Примерно так же, когда хотят вылечить непонятную болезнь без доктора -- без анализа причин и диагноза делают какие-то случайные действия в надежде, что они помогут. Ну или все рассосется само.
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39964024
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
alexeyvg
С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование.
С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции.
А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса).
Если к полному скану таблицы, согласен, что не спасёт. А как вообще поступают, если надо побороть тормоза на больших таблицах, не вдаваясь в поступающие к ним запросы, их планы и т.п.?
Тормоза чаще всего говорят именно о сканах.

Если не "вдаваться", и ничего не менять, то единственный способ - подстегнуть железом. Быстрые процессоры и память, база вся в памяти. Для ускорения записи есть ещё специальный флеш-кэш, пподключаемый непосредственно к процессорам через DIMM.

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

В вашем случае, выигрыш может появиться, если перенести скан на маленькую секцию, ниоткуда ему больше взяться.
И единственный вариант для этого - если у вас запросы включают условие по датам, и секционирование тоже делается по датам. Но тогда нужно изменить подход - делать много файлов, или вообще не делать отдельные файлы (скан партиции в том же файле тоже будет быстрее, она же маленькая). Вот, например, по неделям, как a_voronin написал.
И то, может и не быть ускорения, если причина тормозов в другом (например, блокировки).
...
Рейтинг: 0 / 0
Секционирование в целях архивирования постоянно устаревающих данных
    #39964169
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo Лапыч
А можно больше конкретики, по шагам как это делается?


https://docs.microsoft.com/en-us/sql/relational-databases/partitions/create-partitioned-tables-and-indexes?view=sql-server-ver15
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Секционирование в целях архивирования постоянно устаревающих данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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