パーティション分割と戦略、それをいつどのように使用するかについていくつか質問があります。SQLServer2005のパーティションテーブルとインデックスから理解したように、パーティショニングは、管理のしやすさだけでなく、非常に大規模なデータベーステーブル(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に依存しているため、スキームと関数を削除できません。
- 別のパーティション関数を使用するようにテーブルを割り当てるにはどうすればよいですか?開発のため、パーティション関数の定義方法を変更したり、新しいパーティションを作成したりする必要があります。既存のテーブルに対してこれを行うにはどうすればよいですか?たとえば、前に示した関数の年を変更したい。
よろしくAntonKalcik