sql >> Databáze >  >> RDS >> Sqlserver

Oddíl SQL Server na tabulku na ID tenanta – využitý diskový prostor

Tady je dobrý základ pro dělení od Kendry Little. Mělo by vám pomoci odpovědět na otázku, zda rozdělit nebo ne. http://www. brentozar.com/archive/2012/03/how-decide-if-should-use-table-partitioning/

Jedno doporučení, které mám, je zajistit, aby každý dotaz zasahující do tabulky používal eliminaci oddílů v predikátu.

Pokud jde o skupiny souborů, mějte na paměti, že schéma oddílů mapuje oddíl na skupinu souborů. To by se mohlo zkomplikovat, pokud byste chtěli vytvořit 1 skupinu souborů na tenanta.

S SQL Server 2005 - 2008 R2 je maximum 1 000 oddílů, které může tabulka obsahovat. S rokem 2012 zvýšili limit na 15 000 oddílů. Pokud potřebujete více, rozložte hodnoty oddílů a nechte rozsah, aby určil, na který oddíl budou data přenesena.

Zde je tabulková funkce, kterou můžete použít k odvození využití prostoru podle oddílu:

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;

Potom se můžete dotazovat na funkci s hodnotou tabulky takto:

SELECT * FROM dbo.tvfPartitionAllocationDetails('dbo','mytablename');

To nepředpokládá žádné mimořádkové nebo lobované stránky. Pokud je máte a chcete je zobrazit, lze je snadno přidat do funkce.




  1. Rozdíl mezi časovými pásmy Amerika/Los_Angeles a USA/Pacifik a PST8PDT?

  2. Jak sloučit dva sloupce v SQL a zobrazit je do samostatného záznamu

  3. dynamicky rozevírací seznam v nodejs mysql

  4. Jak vytvářet a mazat databáze a tabulky v PostgreSQL