0

パーティション分割と戦略、それをいつどのように使用するかについていくつか質問があります。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

私の質問:

  1. このアプローチについてどう思いますか?
  2. 指定したパーティションスキームからテーブルを削除するにはどうすればよいですか?インデックスを削除しても、テーブルLog_Seiten_archivに依存しているため、スキームと関数を削除できません。
  3. 別のパーティション関数を使用するようにテーブルを割り当てるにはどうすればよいですか?開発のため、パーティション関数の定義方法を変更したり、新しいパーティションを作成したりする必要があります。既存のテーブルに対してこれを行うにはどうすればよいですか?たとえば、前に示した関数の年を変更したい。

よろしくAntonKalcik

4

2 に答える 2

2
  1. getdate() のような非決定論的関数を使用して SQL Server パーティション関数を作成することはできません。データベースに 10 年間にわたるデータを入力し、SQL Server の実行を停止して数年間監視した場合、日付が変わると、SQL Server がそのデータをあるパーティションから別のパーティションに移動することがわかります。SQL Server のパーティショニングは、そのようには機能しません。パーティション関数が呼び出されると、データは特定のパーティションに配置され、それで終わりです。手動で移動しない限り、再度移動することはありません。

  2. テーブルのパーティション分割を削除するには、パーティション構成を使用しない新しいクラスター化インデックスを適用します。データが移動されます。(データのサイズとディスクの速度によっては、長い時間がかかることに注意してください。数テラバイトのデータ ウェアハウスの場合、おそらく数日とまではいかなくても、数時間はかかるでしょう。)

  3. 別のパーティション関数を割り当てるには、新しいパーティション関数を使用して新しいクラスター化インデックスを適用します。繰り返しになりますが、パーティション機能を頻繁に変更すると、再構築に長い時間がかかります。また、パーティション分割はおそらく求めている答えではありません。

パーティション分割は、個別のドライブ アレイ セットを持つ 1 億行を超えるデータベースに対する優れたソリューションですが、すべてを同じドライブ セット、同じファイル グループに配置しているように思えます。そこではパフォーマンスが大幅に向上することはありません。

また、パーティショニングは SQL Server Enterprise Edition でのみ使用でき、Standard では使用できないことに注意してください。Dev で利用できますが、ライセンスの制限により、本番環境では使用できません。

于 2009-01-20T11:58:49.747 に答える
0

迅速なご回答をありがとうございました。

  1. 開発者は、データがパーティション分割されたテーブルにどのように転送されるかについて責任を負っています。これには多くのアプローチがあり、それぞれに長所と短所があります。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

あかちゃん助けてくれてありがとう

于 2009-01-22T11:53:24.390 に答える