私は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
私の理論は正しいですか?
テーブルのパーティション化はパーティションスキームおよびパーティション関数でしょうか?
そして、この理論はクラスター化列ストアインデックスを使用して機能しますか?
パーティショニングは、シナリオに適しているとは思えません。パーティショニングは軽視されるべきものではありません。多くの計画が必要であり、データを変換するために50億行を書き直す必要があります。代わりに、UNION ALL
ビューを検討する必要があります。要件に応じて、 パーティションビュー にすることもできます。
ビューを使用すると、日付を移動せずにデータを簡単にクエリできます。これは、これまでで最も簡単なソリューションです。
一般に、パーティショニングはクエリのパフォーマンスを向上させません。ただし、列ストアテーブルを使用すると、パーティション化された列でより適切な 行グループの削除 が得られると便利です。これは、列ストアテーブルの構築方法に応じて、パーティション化せずに実現できます。古いデータを変更しない場合は、順序を維持する方法で列ストアを構築するのは比較的簡単です。
ある時点で正当な必要性がある場合、列ストアテーブルはパーティショニングをサポートします。実験するのは簡単です。空のパーティション化された列ストアテーブルを作成してみてください。
私はあなたが言ったように私の会社で同じパーティションテーブルを使用していますが、唯一の違いは、私は月次テーブルを持っており、年次ではありません。また、各テーブルボリュームは約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)