これは、KendraLittleによるパーティショニングの優れた入門書です。パーティションを作成するかどうかの質問に答えるのに役立つはずです。 http://www。 brentozar.com/archive/2012/03/how-decide-if-should-use-table-partitioning/
私が持っている1つの推奨事項は、テーブルにヒットするすべてのクエリが述語でパーティション除去を使用することを確認することです。
ファイルグループに関しては、パーティションスキームがパーティションをファイルグループにマップすることに注意してください。テナントごとに1つのファイルグループを作成する場合、これは複雑になる可能性があります。
SQL Server 2005-2008 R2では、テーブルに含めることができるパーティションの最大数は1,000です。 2012年に、彼らは制限を15,000パーティションに増やしました。それ以上必要な場合は、パーティション値の間隔を空けて、データを配置するパーティションを範囲で決定します。
パーティションごとのスペース使用量を導出するために使用できるテーブル値関数は次のとおりです。
CREATE FUNCTION tvfPartitionAllocationDetails (@schema_name sysname, @table_name sysname)
RETURNS TABLE
AS
RETURN
select f.data_space_id,
f.NAME AS file_group_name,
SCHEMA_NAME(t.schema_id) AS table_schema,
t.name AS table_name,
[HOBT?] = CASE pst.index_id WHEN 0 THEN 'HEAP' WHEN 1 THEN 'B-TREE' END,
p.partition_number,
ps.name AS partition_scheme_name,
pf.name AS partition_function_name,
partition_function_range = CASE pf.boundary_value_on_right WHEN 1 THEN 'RIGHT' WHEN 0 THEN 'LEFT' END,
left_prv.value AS left_range,
right_prv.value AS right_value,
ISNULL(STR(CAST(left_prv.value AS BIGINT)), '-INF')
+ CASE WHEN pf.boundary_value_on_right = 0 THEN ' < '
ELSE ' <= '
END + 'X' + CASE WHEN pf.boundary_value_on_right = 0 THEN ' <= '
ELSE ' < '
END + ISNULL(STR(CAST(right_prv.value AS BIGINT)), 'INF') AS range_desc
,SUM(used_page_count) * 8 [TableSpaceUsed(KB)]
,(SELECT SUM(ISNULL(used_page_count,0)) * 8 FROM sys.dm_db_partition_stats WHERE object_id = p.OBJECT_ID AND partition_number = p.partition_number AND index_id > 1) [NCIndexSpaceUsed(KB)]
,SUM(used_page_count) used_page_count
,row_count
from sys.dm_db_partition_stats pst
INNER JOIN sys.partitions p ON pst.partition_id = p.partition_id
JOIN sys.tables t
ON p.object_id = t.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
JOIN sys.allocation_units au
ON p.hobt_id = au.container_id
JOIN sys.filegroups f
ON au.data_space_id = f.data_space_id
LEFT JOIN sys.partition_schemes ps
ON ps.data_space_id = i.data_space_id
LEFT JOIN sys.partition_functions pf
ON ps.function_id = pf.function_id
LEFT JOIN sys.partition_range_values left_prv
ON left_prv.function_id = ps.function_id
AND left_prv.boundary_id + 1 = p.partition_number
LEFT JOIN sys.partition_range_values right_prv
ON right_prv.function_id = ps.function_id
AND right_prv.boundary_id = p.partition_number
where pst.object_id = object_id(quotename(@schema_name) + '.' + quotename(@table_name))
AND used_page_count > 0
AND pst.index_id IN (0,1)/*Remove Nonclustered index counts*/
GROUP BY f.data_space_id,
f.NAME,
t.schema_id,
t.name,
p.partition_number,
ps.name,
pf.name,
pf.boundary_value_on_right,
left_prv.value,
right_prv.value,
ISNULL(STR(CAST(left_prv.value AS BIGINT)), '-INF')
+ CASE WHEN pf.boundary_value_on_right = 0 THEN ' < '
ELSE ' <= '
END + 'X' + CASE WHEN pf.boundary_value_on_right = 0 THEN ' <= '
ELSE ' < '
END + ISNULL(STR(CAST(right_prv.value AS BIGINT)), 'INF') ,
row_count,
p.OBJECT_ID,
pst.index_id;
次に、次のようにテーブル値関数をクエリできます。
SELECT * FROM dbo.tvfPartitionAllocationDetails('dbo','mytablename');
これは、行外またはLOBページがないことを前提としています。それらがあり、それらを表示したい場合は、関数に簡単に追加できます。