Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Partisi SQL Server per tabel pada ID Penyewa - ruang disk yang digunakan

Inilah primer yang bagus tentang partisi oleh Kendra Little. Ini akan membantu Anda menjawab pertanyaan apakah akan dipartisi atau tidak. http://www. brentozar.com/archive/2012/03/how-decide-if-should-use-table-partitioning/

Satu rekomendasi yang saya miliki adalah memastikan bahwa setiap kueri yang mengenai tabel menggunakan eliminasi partisi dalam predikat.

Untuk grup file, perlu diingat bahwa skema partisi memetakan partisi ke grup file. Ini bisa menjadi rumit jika Anda ingin melakukan 1 grup file per penyewa.

Dengan SQL Server 2005 - 2008 R2, 1.000 partisi adalah maksimum yang dapat berisi tabel. Dengan 2012, mereka meningkatkan batas menjadi 15.000 partisi. Jika Anda membutuhkan lebih dari itu, kosongkan nilai partisi dan biarkan rentang menentukan partisi mana yang akan digunakan data.

Berikut adalah fungsi bernilai tabel yang dapat Anda gunakan untuk mendapatkan penggunaan ruang berdasarkan partisi:

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;

Kemudian Anda dapat menanyakan fungsi bernilai tabel seperti ini:

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

Ini mengasumsikan tidak ada halaman baris atau lob. Jika Anda memilikinya, dan ingin menampilkannya, mereka dapat dengan mudah ditambahkan ke fungsi tersebut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Izin Layanan Pelaporan SQL Server 2008

  2. Biaya persediaan masuk pertama keluar pertama (FIFO)

  3. Prosesor Intel Xeon yang Dapat Diskalakan dan SQL Server 2017

  4. sp_executesql lambat dengan parameter

  5. permintaan tunggal untuk dihapus dari beberapa tabel di server sql