Сценарий:
- две базы данных: DB_A и DB_Archive с одной очень большой таблицей с именем tableA.
- каждый день записи старше 60 дней удаляются из DB_A и перемещаются в DB_Archive, главным образом, чтобы оставить вещь «отделенной», потому что tableA активно запрашивается в DB_A для записей за последние 2 месяца.
Я хочу избавиться от этого процесса, потому что он медленный и потребляет много ресурсов. Я думаю о реализации разбиения таблиц в DB_A с помощью функции секционирования в столбце даты и хранения всех записей <2 месяца в одном разделе и всех записей> 2 месяцев в другом разделе. Мои вопросы:
- будет ли этот сценарий вести себя так, как если бы у меня было 2 разные базы данных? Если я запрашиваю в своей таблице A записи> getdate () - 30, будет ли он читать раздел архивации?
- Я должен был разделить индексы, верно?
- Как мне справиться с тем фактом, что завтра моя функция разбиения «изменится», я имею в виду, если я создам функцию сегодня (2 июля, ее диапазон будет 2 мая, а завтра будет 3 мая). Могу ли я создать функцию динамического разбиения?
Ответы:
С разделением вам придется делать разделение в день, что ставит предопределение Pre-SQL 2012 в 1000 разделов в новом ракурсе, так как это позволит использовать архив только на 3 года. С SQL Server 2012 вы получаете 15000 разделов, что достаточно для 1 раздела в день.
Каждый день вы добавляете новый раздел. Если вы хотите переместить 61-й раздел прошедшего дня, вы можете сделать это эффективно, но все еще в автономном режиме. См. Эффективное перемещение раздела в другую файловую группу .
Все ваши индексы должны быть выровнены, см. « Особые указания для секционированных индексов» .
Покупка в разделение не является легким решением, и это может быть довольно большой укус, чтобы жевать ... см. Как Решить, следует ли Вам Использовать Разделение стола . В частности, вы не должны ожидать улучшения производительности от разбиения. К временным сериалам следует подходить к проблемам производительности путем кластеризации по дате и времени.
источник
. As explained in this white paper, there are implications on certain features, including performance.
. Поддержка SQL 2012 поставляется без предупреждений.Я не знаю, может ли функция разбиения быть динамической, но я сомневаюсь в этом. Некоторые варианты для вас, не пройдя этот маршрут:
1 - раздел в календаре DATE и каждый день удаляйте самый старый раздел
2 - Создайте представление, которое фильтрует по дате, и укажите все свои существующие запросы (это можно легко сделать, переименовав базовую таблицу в другое, и присвоив представлению имя текущей таблицы). Это может быть оптимизировано также с изменениями индекса.
Имейте в виду, что первый вариант выше будет работать намного лучше, если вы используете поле даты в своих запросах. Если вы этого не сделаете, это все равно будет быстрее, чем текущий процесс, но запросы не будут иметь большого улучшения. Разделение в целом работает лучше всего, если вы можете фильтровать поле раздела и оптимизатор знает, на какой раздел смотреть.
источник
Вот что должно работать для вас: DB_A - таблица A с различным разделом для каждого из последних 60 дней - stagingTable для перемещения данных из самого старого раздела
DB_Archive tableA - хранит все данные старше 60 дней. (не разделен)
Процесс: 1. до конца дня: изменить функцию раздела - разделить диапазон, чтобы добавить новый раздел для нового дня. (Примечание: вместо создания разделов для «сегодняшней даты + 1 день» вы можете захотеть быть на несколько шагов вперед. Например: «сегодняшняя дата + 5 дней»)
После окончания каждого дня вы сначала переключаете самый старый раздел в DB_A.tableA на DB_A.stagingTable; Объединить самые старые разделы.
Импортируйте данные из DB_A.stagingTable в DB_Archive.tableA. Наконец trunacte DB_A.stagingTable
Вышеуказанное называется «скользящим окном» и представляет собой довольно распространенный сценарий для VLDB. См. Этот технический документ Microsoft по разделению: таблица разделов и стратегии индексирования или попробуйте это специально для сценария с раздвижным окном.
источник
Вы можете использовать динамический подход архивирования и очистки данных в SQL Server. Пожалуйста, перейдите по ссылке ниже для этого.
http://www.sqlscientist.com/2012/09/auto-maintain-archival-process.html
источник