Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Phân vùng máy chủ SQL trên mỗi bảng trên ID đối tượng thuê - dung lượng đĩa được sử dụng

Đây là một mồi hay về phân vùng của Kendra Little. Nó sẽ giúp bạn trả lời câu hỏi có nên phân vùng hay không. http:// www. brentozar.com/archive/2012/03/how-decide-if-should-use-table-partitioning/

Một khuyến nghị tôi có là đảm bảo rằng mọi truy vấn chạm vào bảng đều sử dụng loại bỏ phân vùng trong vị từ.

Đối với nhóm tệp, hãy nhớ rằng lược đồ phân vùng ánh xạ phân vùng tới nhóm tệp. Điều này có thể phức tạp nếu bạn muốn tạo 1 nhóm tệp cho mỗi người thuê.

Với SQL Server 2005-2008 R2, 1.000 phân vùng là tối đa mà một bảng có thể chứa. Với năm 2012, họ đã tăng giới hạn lên 15.000 phân vùng. Nếu bạn cần nhiều hơn thế, hãy giải phóng các giá trị của phân vùng và để phạm vi xác định dữ liệu sẽ đi đến phân vùng nào.

Đây là một hàm có giá trị của bảng mà bạn có thể sử dụng để lấy dung lượng sử dụng theo phân vùng:

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;

Sau đó, bạn có thể truy vấn hàm có giá trị bảng như sau:

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

Điều này giả định rằng không có các trang nằm ngoài hàng hoặc không có trang. Nếu bạn có và muốn hiển thị chúng, bạn có thể dễ dàng thêm chúng vào hàm.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi DateTime sang VarChar

  2. Cách đọc nhiều tập kết quả được trả về từ một thủ tục được lưu trữ trên SQL Server trong R

  3. cách tạo và gọi hàm vô hướng trong sql server 2008

  4. máy chủ sql được liên kết máy chủ với oracle trả về không tìm thấy dữ liệu nào khi dữ liệu tồn tại

  5. Cách ORIGINAL_DB_NAME () hoạt động trong SQL Server