sql >> データベース >  >> RDS >> Sqlserver

テナントIDのテーブルごとのSQLServerパーティション-使用されるディスク容量

    これは、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ページがないことを前提としています。それらがあり、それらを表示したい場合は、関数に簡単に追加できます。




    1. Oracleは制約を見つけます

    2. LAST_INSERT_ID()MySQL

    3. SQLでrownumを使用して重複レコードを削除する

    4. P_AAの呼び出しで引数の数またはタイプが間違っています