SQL Server
[MSSQL] 17. 파티션 테이블 조회 및 Row수 구하기
푸팟퐁쿼리
2023. 4. 25. 21:39
DB에 존재하는 모든 사용자 파티션 테이블을 조회하고 Row 수를 구할 때 사용하는 쿼리입니다.
IF OBJECT_ID(N'tempdb..#DB') IS NOT NULL
BEGIN
DROP TABLE #DB
END
CREATE TABLE #DB (name sysname, dbid smallint)
INSERT INTO #DB (name, dbid)
SELECT name, dbid FROM master.dbo.sysdatabases
WHERE name not in ('master', 'msdb', 'model')
GO
DECLARE @dbname sysname
DECLARE @min_dbid smallint
DECLARE @SQL varchar(8000)
IF OBJECT_ID(N'tempdb..#PARTITION') IS NOT NULL
BEGIN
DROP TABLE #PARTITION
END
CREATE TABLE #PARTITION (
database_id int
, dbName sysname
, schName sysname
, tabName sysname
, PartitionScheme sysname
, PartitionFunc sysname
, FileGroupName sysname
, indexName sysname
, indexID INT
, PartitionNumber INT
, compression_level varchar(100)
, LowerBoundaryValue sql_variant
, UpperBoundaryValue sql_variant
, PartitionFunctionRange varchar(20)
, Rows BIGINT
);
SET @min_dbid = 4
WHILE (@min_dbid IS NOT NULL)
BEGIN
SELECT @min_dbid = MIN(dbid) FROM #DB WHERE dbid > @min_dbid
IF (@min_dbid IS NULL) BREAK
SELECT @dbname = name FROM #DB WHERE dbid = @min_dbid
SET @SQL = 'USE [' + @dbname + ']; '
SET @SQL = @SQL + '
SELECT
DB_ID() as database_id,
DB_NAME() as dbName,
OBJECT_SCHEMA_NAME(p.object_id) AS schemaName,
OBJECT_NAME(p.object_id) AS ObjectName,
ds.name AS PartitionScheme,
pf.name AS PartitionFunc,
fg.name AS FileGroupName,
i.name AS IndexName,
p.index_id AS IndexID,
p.partition_number AS PartitionNumber,
p.data_compression_desc as compression_level,
prv_left.value AS LowerBoundaryValue,
prv_right.value AS UpperBoundaryValue,
CASE pf.boundary_value_on_right WHEN 1 THEN ''RIGHT'' ELSE ''LEFT'' END AS PartitionFunctionRange,
p.rows AS Rows
FROM
sys.partitions AS p INNER JOIN
sys.indexes AS i ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN
sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id INNER JOIN
sys.partition_schemes AS ps ON ps.data_space_id = ds.data_space_id INNER JOIN
sys.partition_functions AS pf ON pf.function_id = ps.function_id INNER JOIN
sys.destination_data_spaces AS dds2 ON dds2.partition_scheme_id = ps.data_space_id AND dds2.destination_id = p.partition_number INNER JOIN
sys.filegroups AS fg ON fg.data_space_id = dds2.data_space_id LEFT OUTER JOIN
sys.partition_range_values AS prv_left ON ps.function_id = prv_left.function_id AND prv_left.boundary_id = p.partition_number - 1 LEFT OUTER JOIN
sys.partition_range_values AS prv_right ON ps.function_id = prv_right.function_id AND prv_right.boundary_id = p.partition_number
WHERE p.index_id = (select min(index_id) from sys.indexes where object_id = p.object_id)
order by p.object_id, p.index_id, p.partition_number
'
INSERT INTO #PARTITION
EXEC (@SQL)
END
SELECT
database_id AS DBID
, dbName
, schName
, tabName
, PartitionScheme AS PartScheme
, PartitionFunc AS PartFunc
, FileGroupName AS fgName
--, indexName
--, indexID
, PartitionNumber AS PartNum
, compression_level AS CompressLevel
, LowerBoundaryValue AS LValue
, UpperBoundaryValue AS RValue
, PartitionFunctionRange AS PRange
, Rows
FROM #PARTITION
ORDER BY dbName, tabName, PartitionNumber