|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Есть большая таблица, в которую постоянно добавляются данные, данные за последнюю неделю могут модифицироваться, остальные лежат уже без изменений и используются только в отчётах. Нужно сделать так, чтобы данные за последнюю неделю хранились в одном файле, а архивные - в другом. Причём каждый день неделя передвигается на день вперёд. Я сделал через три файловых группы и функцию секционирования по следующим правилам: 1) от сотворения мира до неделю назад; 2) от неделю назад до завтра; 3) от завтра до конца света. Проблема в том, что даты забиваются жёстко, и завтра уже этот план будет работать не так, как задумывался. Я "решил" эту проблему через ежедневную модификацию функции секционирования весьма извращённым на мой взгляд способом: 1. Удаляю из функции секционирования секцию 2), объединяя её с секцией 1). 2. Добавляю к функции секционирования удалённую секцию 2), с границей неделя назад (теперь от текущего дня). 3. Удаляю из функции секционирования секцию 3), объединяя её с секцией 2). 4. Добавляю к функции секционирования удалённую секцию 3), с границей завтра (теперь от текущего дня). И мне кажется, что всё это будет жутко медленно работать (если вообще будет). Внимание, вопрос: а как это сделать правильно? Спасибо за ответы! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 17:40 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч, для чего вам именно секции? Создайте несколько таблиц и представление или табличную функцию для просмотра. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 18:09 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Если очень хочется секционировать, то можно вместо даты добавить битовое поле "архив", секционировать по этому полю и обновлять его по расписанию заданным алгоритмом. Но с таблицами еще лучше - архивную таблицу можно поместить в отдельную базу и создать секционированное представление с использованием того же архивного бита. Для выбора таблицы в запросе можно использовать функцию, вычисляющую признак архивности. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 18:30 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
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 данные из оперативной таблицы в архивную, удаляя их из оперативной таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 19:53 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
так, сбили файловые группы :) неправильно понял задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 20:09 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
ну ежедневно это наверное слишком часто Я бы это делал раз в неделю и держал бы еще пару партиций "две недели назад" и "неделю вперед" То есть вместо трех партиций "архив", "текущая", "будуще" сделал бы пять: "архив", "еще не архив, но никакой активности", "текущая", "пока пустая, но уже готовлюсь" , "будущее" Тогда раз в неделю разбивал бы партицию "будущее" на "будущее" и "неделю вперед" и объединял бы партицию "архив" и "две недели назад". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2020, 21:10 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч Я сделал через три файловых группы и функцию секционирования по следующим правилам: 1) от сотворения мира до неделю назад; 2) от неделю назад до завтра; 3) от завтра до конца света. Это не самая хорошая идея. Лучше сделайте партиционирование по месяцам и отгоняйте партицию в другую таблицу. К тому же такого секционирования, как вы описали, вы не сделаете. Вот наступает 24:00 и "сегодня" превращается во "вчера", а "7 дней назад" в "8 дней назад". Внимание вопрос, что на физическом уровне у вас должно случиться с данными? Если вы говорите о разных файлах, то у вас должно начаться крупное копирование данных, а не просто switch partition. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 08:13 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч Нужно сделать так, чтобы данные за последнюю неделю хранились в одном файле, а архивные - в другом. Причём каждый день неделя передвигается на день вперёд. Если цель - размещение архивных данных на медленном, но недорогом, хранилище, то лучше делать суточные секции, и перемещать ежедневно соответствующий файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 08:23 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Владислав Колосов 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 Каждый день копировать данные за сутки из одного файла в другой - ИМХО не самая лучшая идея. Если цель - размещение архивных данных на медленном, но недорогом, хранилище, то лучше делать суточные секции, и перемещать ежедневно соответствующий файл. Всем спасибо за ответы! Хотелось бы больше конкретики: не только "что", но и "как". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 12:41 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч Суть задачи дать оперативным операторам DML работать только с оперативными данными (и индексами), а архивным - с оперативными и архивными. Цель - уменьшение времени оперативных запросов, пускай и за счёт увеличения времени архивных. Сейчас данные за два месяца в этой таблице приводят к резкому спаду производительности, вплоть до отказов в ответах на запросы по таймауту. Тогда нужно сделать так, что бы запросы работали с большой таблицей с такой же скоростью, как и с маленькой. Это несложно, это как бы получается само собой, если в модели и запросах нет косяков. Leo Лапыч Всем спасибо за ответы! Хотелось бы больше конкретики: не только "что", но и "как". Leo Лапыч Владислав Колосов Если очень хочется секционировать, то можно вместо даты добавить битовое поле "архив", секционировать по этому полю и обновлять его по расписанию заданным алгоритмом. Но с таблицами еще лучше - архивную таблицу можно поместить в отдельную базу и создать секционированное представление с использованием того же архивного бита. Для выбора таблицы в запросе можно использовать функцию, вычисляющую признак архивности. Да, при обновлении записи будут перемещаться из файла в файл. И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 13:19 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч, Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос. В архив (или другую файловую группу) перегоняется раз год руками. Всякий раз, когда начинали говорить о скользящей дате архивации, либо возникал геморрой, либо после долгой болтовни про эту идею забывали. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:22 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
alexeyvg А, так вы не в медленное хранилище перемещаете? Тогда нужно сделать так, что бы запросы работали с большой таблицей с такой же скоростью, как и с маленькой. Это несложно, это как бы получается само собой, если в модели и запросах нет косяков. alexeyvg Да, можно сделать обычное поле. Да, при обновлении записи будут перемещаться из файла в файл. И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???) a_voronin Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос. В архив (или другую файловую группу) перегоняется раз год руками. a_voronin Всякий раз, когда начинали говорить о скользящей дате архивации, либо возникал геморрой, либо после долгой болтовни про эту идею забывали. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 13:40 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч alexeyvg Да, можно сделать обычное поле. Да, при обновлении записи будут перемещаться из файла в файл. И, разумеется, скорость запросов упадёт, цель достигнута не будет (а чего вы ожидали, за счёт чего вдруг станет быстрее???) С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции. А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 13:57 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч А вопрос о секционировании очередной раз встал, и хочется попробовать и посмотреть на результат. Пока не касаясь механизмов переноса в архивную секцию, для оценки производительности это несущественно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 14:00 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч a_voronin Лично я всегда делаю партиционирование на 2-3 года вперед и забываю про этот вопрос. В архив (или другую файловую группу) перегоняется раз год руками. А причем тут сотни файлов. Сотни партиций не подразумевают сотни файлов. Партиционирование по неделям (лучше неделям ISO) вполне имеет право на существование. Лишь бы лимит партиций не кончился == 15000. Просто не надо двигать границы уже заполненных партиций. Вот это гемор. Можно сделать партиционирование по (год-неделя, архив-не-архив). Архив в одну файловую группу, не архив в другую класть. Недельную порцию данных переливать (не через UPDATE, а через SELECT INSERT - TRUNCATE PARTITION) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 14:03 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
alexeyvg С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование. С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции. А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 12:33 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
alexeyvg С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование. С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции. А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса). a_voronin А причем тут сотни файлов. Сотни партиций не подразумевают сотни файлов. Партиционирование по неделям (лучше неделям ISO) вполне имеет право на существование. Лишь бы лимит партиций не кончился == 15000. Просто не надо двигать границы уже заполненных партиций. Вот это гемор. Можно сделать партиционирование по (год-неделя, архив-не-архив). Архив в одну файловую группу, не архив в другую класть. Недельную порцию данных переливать (не через UPDATE, а через SELECT INSERT - TRUNCATE PARTITION) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 12:39 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo ЛапычА как вообще поступают, если надо побороть тормоза на больших таблицах, не вдаваясь в поступающие к ним запросы, их планы и т.п.?Примерно так же, когда хотят вылечить непонятную болезнь без доктора -- без анализа причин и диагноза делают какие-то случайные действия в надежде, что они помогут. Ну или все рассосется само. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 12:41 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч alexeyvg С того, что сервер будет выполнять те же действия ,что и в случае несекционированной таблицы, только ещё будет оверхед на секционирование. С чего запросам то ускориться, если неоптимальная модель или запрос приводит к скану таблицы? Он и будет продолжать сканить, только теперь уже 2 секции. А если запрос оптимально выбирал данные по индексу, то он будет выбирать их так же, по тому же индексу (или, если индекс тоже секционирован, то по двум частям индекса). Если не "вдаваться", и ничего не менять, то единственный способ - подстегнуть железом. Быстрые процессоры и память, база вся в памяти. Для ускорения записи есть ещё специальный флеш-кэш, пподключаемый непосредственно к процессорам через DIMM. То есть "волшебной кнопки" нету. Если бы такое секционирование волшебным образом помогало, сервер бы сразу все таблицы делал секционированными, правильно? Секционирование помогает в совершенно определённых ситуациях (например, для ускорения загрузки-удаления, или для превращения скана таблицы в скан небольшой секции), но всё это нужно делать с учётом запросов и планов. В вашем случае, выигрыш может появиться, если перенести скан на маленькую секцию, ниоткуда ему больше взяться. И единственный вариант для этого - если у вас запросы включают условие по датам, и секционирование тоже делается по датам. Но тогда нужно изменить подход - делать много файлов, или вообще не делать отдельные файлы (скан партиции в том же файле тоже будет быстрее, она же маленькая). Вот, например, по неделям, как a_voronin написал. И то, может и не быть ускорения, если причина тормозов в другом (например, блокировки). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 12:58 |
|
Секционирование в целях архивирования постоянно устаревающих данных
|
|||
---|---|---|---|
#18+
Leo Лапыч А можно больше конкретики, по шагам как это делается? https://docs.microsoft.com/en-us/sql/relational-databases/partitions/create-partitioned-tables-and-indexes?view=sql-server-ver15 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 16:39 |
|
|
start [/forum/topic.php?fid=46&msg=39963352&tid=1686055]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 433ms |
0 / 0 |