web-dev-qa-db-ja.com

テーブルパーティションは役に立ちますか?

私は10のテーブルを持っています。

dbo.Table2008
dbo.Table2009
...
dbo.Table2018

各テーブルには、20列幅の約500,000,000レコードが保持されます(重要な場合)。そして、各テーブルにはクラスター化された列ストアインデックスがあります。
各テーブルには、その名前にその年のデータのみが含まれています。たとえば、dbo.Table2008には、CreatedDate列が>= 20080101および<= 20081231であるレコードのみが表示されます。しかし、3年間にわたってクエリを発行したい場合は、3つのテーブルすべてをユニオンでヒットする必要があります。

私の理論では、dbo.Tableという単一のテーブルが約120のパーティションに分割されており、毎年毎月1つのパーティションに分割されている場合、テーブルの数が減るだけではありません。だから私は私のクエリをから変更することができます

with cte as (
    select col1, col2, col3, col4
    from table2008
    where col4 >= 20080201 and col4 <= 20120801
    union
    select col1, col2, col3, col4
    from table2009
    where col4 >= 20080201 and col4 <= 20120801
    union
    select col1, col2, col3, col4
    from table2010
    where col4 >= 20080201 and col4 <= 20120801
    union
    select col1, col2, col3, col4
    from table2011
    where col4 >= 20080201 and col4 <= 20120801
) select ...
from cte
join LookupTable1 on ... = ...
join LookupTable2 on ... = ...

select col1, col2, col3, col4, lookuptablecol1, lookuptable2col2
from dbo.Table
join ALL MY LOOKUP TABLES

私の理論は正しいですか?
テーブルのパーティション化はパーティションスキームおよびパーティション関数でしょうか?
そして、この理論はクラスター化列ストアインデックスを使用して機能しますか?

1
gh0st

パーティショニングは、シナリオに適しているとは思えません。パーティショニングは軽視されるべきものではありません。多くの計画が必要であり、データを変換するために50億行を書き直す必要があります。代わりに、UNION ALLビューを検討する必要があります。要件に応じて、 パーティションビュー にすることもできます。

ビューを使用すると、日付を移動せずにデータを簡単にクエリできます。これは、これまでで最も簡単なソリューションです。

一般に、パーティショニングはクエリのパフォーマンスを向上させません。ただし、列ストアテーブルを使用すると、パーティション化された列でより適切な 行グループの削除 が得られると便利です。これは、列ストアテーブルの構築方法に応じて、パーティション化せずに実現できます。古いデータを変更しない場合は、順序を維持する方法で列ストアを構築するのは比較的簡単です。

ある時点で正当な必要性がある場合、列ストアテーブルはパーティショニングをサポートします。実験するのは簡単です。空のパーティション化された列ストアテーブルを作成してみてください。

1
Joe Obbish

私はあなたが言ったように私の会社で同じパーティションテーブルを使用していますが、唯一の違いは、私は月次テーブルを持っており、年次ではありません。また、各テーブルボリュームは約50GBです。

異なる月に属するテーブルをクエリするために、動的SQLを使用して、変数に渡す値に基づいて正しいテーブルを選択します。 1年を過ぎると、クエリはその年に属するすべてのテーブルを結合し、データを検索します。このロジックはすべてprocからのものになります。したがって、動的SQLを構築するためにprocにパラメータを追加するだけです。

例:

DECLARE @YYYYMM INT = 200801
DECLARE @SearchString VARCHAR(150) = 'customer1'
DECLARE @TSQL VARCHAR(5000)
DECLARE @Table VARCHAR(100)

SET @Table = 'Table' + CONVERT(VARCHAR,@YYYYMM)
SET @TSQL = 'SELECT * FROM ' + @Table + ' WHERE Column1 LIKE ''%' + @SearchString +'%'''

EXEC (@TSQL)
0
Krishna Sriram