У меня есть несколько вопросов о разделении и стратегии, как и когда его использовать. Как я понял из Секционированных таблиц и индексов в SQL Server 2005 , секционирование используется не только для управляемости, но и для повышения производительности очень больших таблиц базы данных (VLDB). У нас есть таблица с миллионами записей. В этой таблице хранятся данные о производительности, например, сколько раз был указан элемент при нажатии и т. Д. Нам нужно ежедневно оценивать эти данные за текущий месяц в реальном приложении. Я хочу предотвратить перемещение данных из одной таблицы в другую только из-за производительности.
Моя идея была: я создаю раздел на этом VLDB по месяцам за текущий год. Затем я бы создал кластерный индекс по полю даты таблицы и схеме разбиения. Я не знаю, правильно ли я понимаю, но я исключаю, что этот индекс будет создаваться отдельно для каждого раздела.
Как выглядит мой код на этапе разработки.
/*
Maybe it looks like complicated, but instead of static upper bound,
I use function to determine end of the month for the current year.
So for example (executed in year 2009)
SELECT DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1901)*12)+1-1,31-1))
returns
2008-01-30 23:59:59.997
*/
CREATE PARTITION FUNCTION PartitionMonthlyCurrentYear(DATETIME) AS
RANGE LEFT FOR VALUES
(
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1901)*12)+1-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+1-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+2-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+3-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+4-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+5-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+6-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+7-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+8-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+9-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+10-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+11-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+12-1,31-1))
);
/*
Create scheme on the primary file group. I'm aware about performance issues of this.
*/
CREATE PARTITION SCHEME SchemeMonthlyCurrentYear
AS PARTITION PartitionMonthlyCurrentYear
ALL TO ([PRIMARY]);
/*
Create clustered index on table and scheme
*/
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum] ON [dbo].[Log_Seiten_archiv]
(
[Datum] DESC
)ON SchemeMonthlyCurrentYear(Datum)
GO
Мои вопросы:
- Что вы думаете об этом подходе?
- Как удалить таблицу из
указана схема разбиения? Если я удаляю индекс, я все равно не могу удалить схему и функцию, потому что все еще существует зависимость от таблицы Log_Seiten_archiv
- Как мне назначить таблицу для использования другой функции секционирования? Из-за разработки мне часто приходится менять способ определения функции разделов или создавать новую. Как я могу сделать это для существующей таблицы? Например, я хочу изменить год для функции, которую я показывал ранее.
С уважением
Антон Калчик