星期五, 12月 06, 2013

[SQL] Partition Function

Partition Function 會指定如何分割資料表或索引並將資料對應到單一 Partition,建立 Partition Funcation,要決定
  1. DataType:資料型態必須和 Partition Column 的資料型態一致
  2. Boundary Value:資料界限值
  3. Range Left、Range Right:資料界限值是屬於 Boundary Value 的左邊還是右邊的 Partition

Partition Function 和 User Define Function

兩者是不一樣的 object,Partition Function 只能應用在 Partition Table 且沒有 Database Schema,在 sys.all_objects 或 sys.objects 內無法找到它,要查詢 Partition Function 有兩種方法:
  1. SSMS:DB => 儲存體 => 資料分割函數
  2. T-SQL:sys.partition_functions
日期資料型態

依日期為分割依據,建議利用 RANGE RIGHT 且依每個月 1 號為 Boundary Value,不要利用月底,畢竟不是每個月都是相同天數 EX:0131、0228(0229)、0430,使用上會較單純。

以 20130901、20131001、20131101 為 Boundary Value 來說明:

RANGE LEFT 切成 Partion 範圍會是

Partition範圍
Partition 1min - 20130901
Partition 220130902 - 20131001
Partition 320131002 - 20131101
Partition 420131102 - max

從 partiton 2、3 可以發現,Partitton 內的資料不單是一個月份的資料,之後需要進行 Switch 的話,因為月份資料混在一起,在管理和維護上會出現問題

RANGE RIGHT 切成 Partition 範圍會是

Partition範圍
Partition 1min - 20130831
Partition 220130901 - 20130930
Partition 320131001 - 20131031
Partition 420131101 - max

從 partiton 2、3 可以發現,每個 Partition 內只會有單一月份資料,月份資料不會混在一起,
每個 Boundary Value 就是月份資料的起點,對於資料解讀上也較直覺

字串資料型態
    字串要注意定序(Collation)的問題,大 A 和 小 a 切 Partition 可是有所差異

    查詢相關設定

    查詢 Partition Table Boundary Value
      SELECT
          PF.function_id , 
          PF.name , 
          PF.fanout AS NumPartitions , 
          CASE 
              WHEN PF.boundary_value_on_right = 0 THEN 'LEFT' 
              ELSE 'RIGHT' 
          END AS RangeType , 
          PP.parameter_id , 
          CASE 
              WHEN PP.system_type_id = PP.user_type_id THEN T1.name 
              ELSE T2.name 
          END AS ParameterDataType , 
          PRV.boundary_id , 
          PRV.value , 
          CASE 
              WHEN PF.boundary_value_on_right = 0 THEN PRV.boundary_id 
              ELSE PRV.boundary_id + 1 
          END AS PartitionNumber
      FROM sys.partition_functions AS PF
        JOIN sys.partition_parameters AS PP ON PF.function_id = PP.function_id
        JOIN sys.types AS T1  ON T1.system_type_id = PP.system_type_id
        JOIN sys.types AS T2  ON T2.user_type_id= PP.user_type_id
        JOIN sys.partition_range_values AS PRV ON PP.function_id = PRV.function_id AND PP.parameter_id = PRV.parameter_id
      

      沒有留言:

      張貼留言