Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Partycja SQL Server na tabelę na identyfikatorze dzierżawcy — zajęte miejsce na dysku

Oto dobry wstęp do partycjonowania autorstwa Kendry Little. Powinno to pomóc ci odpowiedzieć na pytanie, czy podzielić, czy nie. http://www. brentozar.com/archive/2012/03/how-decide-if-should-use-table-partitioning/

Jedną z moich rekomendacji jest upewnienie się, że każde zapytanie trafiające do tabeli używa eliminacji partycji w predykacie.

Jeśli chodzi o grupy plików, należy pamiętać, że schemat partycji mapuje partycję do grupy plików. Może się to skomplikować, jeśli chcesz utworzyć 1 grupę plików na dzierżawcę.

W przypadku SQL Server 2005-2008 R2 maksymalna liczba partycji to 1000 partycji, które może zawierać tabela. W 2012 roku zwiększyli limit do 15 000 partycji. Jeśli potrzebujesz więcej, oddziel wartości partycji i pozwól zakresowi określić, do której partycji trafią dane.

Oto funkcja o wartości tabeli, której można użyć do określenia wykorzystania miejsca przez partycję:

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;

Następnie możesz wysłać zapytanie do funkcji o wartości tabeli w następujący sposób:

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

Zakłada to brak stron poza wierszem lub lob. Jeśli je posiadasz i chcesz je wyświetlić, możesz je łatwo dodać do funkcji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem we wdrażaniu projektu DB

  2. Wysyłanie wiadomości e-mail przez serwer SQL NIE powiodło się

  3. Czy możliwe jest utworzenie bazy danych w SQL Server za pomocą powershell?

  4. STRING_SPLIT() w SQL Server 2016:kontynuacja nr 1

  5. wybierając górną kolumnę1 z pasującą kolumną2