web-dev-qa-db-ja.com

SQLでパーティション境界とファイルグループをフェッチする

指定されたパーティションスキーム名について、以下のセットを取得する必要があります

  • 境界値
  • ファイルグループ名

このmustは、スキーマに参加しているテーブルが存在しなくても機能します。

つまりsys.indexesによる結合は機能しません。

私は考えます答えはsys.destination_data_spacesにありますが、sys.partition_range_valuesへの結合をまだ理解していません。

1
Paul Holmes

この関係は完全に直感的ではありませんが、このクエリで必要なものが得られると思います。

SELECT 
  PScheme       = ps.name, 
  PFunction     = pf.name,
  Boundary      = dds.destination_id,
  BoundaryValue = prv.value,
  [Filegroup]   = fg.name
FROM sys.partition_schemes AS ps
INNER JOIN sys.partition_functions AS pf
        ON ps.function_id = pf.function_id
INNER JOIN sys.destination_data_spaces AS dds
        ON ps.data_space_id = dds.partition_scheme_id
INNER JOIN sys.filegroups AS fg
        ON dds.data_space_id = fg.data_space_id
LEFT OUTER JOIN sys.partition_range_values AS prv
        ON dds.destination_id = pf.boundary_value_on_right + prv.boundary_id 
       AND prv.function_id = pf.function_id;

そして、LEFT/RIGHTは常に私にとって面倒な精神的な練習なので、最後から2行目のboundary_value_on_rightの部分を反転する必要があるかもしれません。

ON dds.destination_id = prv.boundary_id + ABS(1-pf.boundary_value_on_right)  

テーブルを作成する必要はありません。

2
Aaron Bertrand

Aaronの回答をジャンプオフとして使用して、これを取得しました。これは、sys.partition_range_valuesで機能しない「境界のない」パーティションを許可するためです。

ここで重要なのは、sys.destination_data_spacesで、

  • RANGE RIGHT、境界のないパーティションは、border_id = 1です。
  • RANGE LEFT、境界のないパーティションはmax(boundary_id)です

これは正しい評価ですか?

SELECT PScheme = ps.name,
       PFunction = pf.name,
       Boundary = prv.boundary_id, -- Null for 'boundaryless'
       BoundaryValue = prv.Value, -- Null for 'boundaryless'
       [Filegroup] = fg.name
FROM sys.destination_data_spaces AS dds
INNER JOIN sys.filegroups AS fg
    ON dds.data_space_id = fg.data_space_id
INNER JOIN sys.partition_schemes AS ps
    ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf
    ON pf.function_id = ps.function_id
LEFT JOIN sys.partition_range_values AS prv
    ON pf.function_id = prv.function_id AND
        dds.destination_id = (prv.boundary_id + pf.boundary_value_on_right)
1
Paul Holmes