SQL Server 2005でのパーティション分割
-
19-08-2019 - |
質問
パーティショニングと戦略、その使用方法と使用時期について質問があります。 SQL Server 2005のパーティションテーブルとインデックスから理解したとおり、パーティショニングは管理性だけでなく、非常に大きなデータベーステーブル(VLDB)のパフォーマンス向上にも使用されます。何百万ものレコードを持つテーブルがあります。このテーブルには、指定されたアイテムがクリックされた回数などのパフォーマンスデータが格納されます。現在の月のこのデータを実際のアプリケーションで毎日評価する必要があります。防止したいのは、パフォーマンスのためだけに、あるテーブルから別のテーブルにデータを移動することです。 私の考えは、このVLDBに現在の年の月ごとにパーティションを作成することでした。次に、テーブルとパーティションスキームの日付フィールドにクラスター化インデックスを作成します。 <!>#8217;私はそれを正しく理解しているかどうかはわかりませんが、例外はパーティションごとに個別に作成されることです。
一般に、開発段階での私のコードの外観。
/*
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
私の質問:
- このアプローチについてどう思いますか?
- どのようにしてテーブルを削除できますか 指定されたパーティションスキーム?インデックスを削除しても、<!>#8217;まだスキーマと機能を削除できません。テーブル Log_Seiten_archiv への依存関係が残っているためです。
- 異なるパーティション関数を使用するようにテーブルを割り当てるにはどうすればよいですか?開発のため、パーティション機能の定義方法を頻繁に変更するか、新しいパーティションを作成する必要があります。既存のテーブルに対してこれを行うにはどうすればよいですか?たとえば、前に示した関数の年を変更したいです。
よろしく アントン・カルチク
解決
-
getdate()などの非決定的関数を使用してSQL Serverパーティション関数を作成することはできません。データベースに10年にわたるデータを入力し、その後停止してSQL Serverが数年間実行されるのを見ると、日付が変更されるとSQL Serverがそのデータをあるパーティションから別のパーティションに移動することがわかります。 SQL Serverのパーティション分割はそのようには機能しません。パーティション関数が呼び出されると、データは特定のパーティションに配置され、それで終わりです。手動で移動する場合を除き、再び移動することはありません。
-
テーブルのパーティションを削除するには、パーティションスキームを使用しない新しいクラスター化インデックスを適用します。データが移動されます。 (データのサイズとディスクの速度によっては時間がかかることに注意してください。数テラバイトのデータウェアハウスでは、おそらく数日ではなく数時間を話します。)
-
別のパーティション関数を割り当てるには、新しいパーティション関数を使用して新しいクラスター化インデックスを適用します。繰り返しますが、パーティション機能を頻繁に変更すると、再構築に時間がかかるため、おそらくパーティション分割は探している答えではありません。
パーティショニングは、個別のドライブアレイセットを備えた1億行のデータベースに対する優れたソリューションですが、同じファイルグループの同じドライブセットにすべてを配置しているように聞こえます。そこでは、パフォーマンスが大幅に向上することはありません。
また、パーティション分割は標準ではなくSQL Server Enterprise Editionでのみ使用できることに注意してください。 Devで使用できますが、ライセンスの制限のために運用環境では使用できません。
他のヒント
ご回答ありがとうございます。
- 開発者がデータをパーティションテーブルに転送する方法について責任があることは事実です。これには多くのアプローチがあり、それらのすべてに利点と欠点があります。これに関する優れた記事を Technet で見つけました。 >
今、パーティション機能を削除または再割り当てする方法を理解しました。
ここに例:
既存のテーブルにパーティションを作成:
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily]
(
[Datum] DESC,
[kanzleinr] ASC
)ON SchemeDailyCurrentYear(Datum)
GO
既存のテーブルにパーティションをドロップします:
DROP INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily];
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily]
(
[Datum] DESC,
[kanzleinr] ASC
)ON [PRIMARY]
GO
ご協力ありがとうございます AKa