Récupérer les informations de partitionnement d’une table

Si avez besoin de récupérer de façon exhaustive les metadada de partitionnement d’une table, à savoir :

  • la fonction de partitionnement
  • le schéma de partitionnement
  • le mode de gestion des bornes (LEFT / RIGHT)
  • la liste des partitions
  • le mode de compression utilisé sur chacune des partitions
  • le filegroup de destination de chaque partition
  • les paramètres de la fonction de partionnement
  • le mapping paramètres/colonnes
  • les valeurs des bornes de partitionnement par paramètre
  • les bornes min et max relatives à chaque (partition, paramètre)

ce script vous sera certainement utile :

declare @tableName as nvarchar(128) = 'myPartitionedTable';

with cte as
(
select
tables.object_id as tableId,
tables.schema_id as schemaId,
'[' + schemas.name + '].[' + tables.name + ']' as tableName,
partition_functions.function_id as partitionFunctionId,
partition_schemes.name as partitionSchemeName,
partition_functions.name as partitionFunctionName,
partition_functions.Boundary_value_on_right as partitionBoundaryValueOnRight,
case when partition_functions.Boundary_value_on_right=1 then N'RIGHT' else N'LEFT' end as partitionBoundaryValueOnRightDesc,
partitions.partition_number as partitionNumber,
partitions.rows as partionRows,
partitions.data_compression_desc as partitionCompressionType,
filegroups.name as filegroupName,
partition_range_values.parameter_id as parameterId,
'[' + columns.name + ']' as columnName,
partition_range_values.value as boundValue
from
sys.tables
inner join sys.schemas on schemas.schema_id = tables.schema_id
inner join sys.indexes on tables.object_id = indexes.object_id
inner join sys.partition_schemes on partition_schemes.data_space_id = indexes.data_space_id
inner join sys.partition_functions on partition_functions.function_id = partition_schemes.function_id
inner join sys.partition_parameters on partition_parameters.function_id = partition_functions.function_id
inner join sys.index_columns on index_columns.object_id = indexes.object_id and index_columns.index_id = indexes.index_id and index_columns.partition_ordinal = partition_parameters.parameter_id
inner join sys.columns on columns.object_id = index_columns.object_id and columns.column_id = index_columns.column_id
inner join sys.partitions on partitions.object_id = tables.object_id and partitions.index_id = indexes.index_id
inner join sys.destination_data_spaces on destination_data_spaces.destination_id = partitions.partition_number
inner join sys.filegroups on filegroups.data_space_id = destination_data_spaces.data_space_id
left join sys.partition_range_values on partition_range_values.function_id = partition_functions.function_id and partition_range_values.boundary_id = partition_number and partition_range_values.parameter_id = partition_parameters.parameter_id
where tables.type='U'
and indexes.type=1
and tables.object_id=object_id(@tableName)
)

select
currentPartition.*,
case
when currentPartition.partitionBoundaryValueOnRight=0 then
' > ' + cast(previousPartition.boundValue as nvarchar)
else
' >= ' + cast(previousPartition.boundValue as nvarchar)
end boundMin,
case
when currentPartition.partitionBoundaryValueOnRight=0 then
' <= ' + cast(currentPartition.boundValue as nvarchar)
else
' < ' + cast(currentPartition.boundValue as nvarchar)
end boundMax
from
cte as currentPartition
left join cte as previousPartition
on previousPartition.tableId = currentPartition.tableId
and previousPartition.partitionFunctionId = currentPartition.partitionFunctionId
and previousPartition.partitionNumber = currentPartition.partitionNumber - 1
order by currentPartition.partitionNumber;

N.B : notez que je suppose qu’il existe un indexe clustered sur ma table partitionnée, et que par conséquent, il contient la clé de partitionnement (cf. filtre indexes.type=1 dans la cte).

Pour un descriptif détaillé des vues système utilisées, je vous renvoie aux références que j’ai utilisées :

  1. http://msdn.microsoft.com/en-us/library/ms187924(v=sql.105).aspx
  2. http://sqlserverpedia.com/wiki/Retrieving_Partition_Metadata

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s