Skip to content

Commit 2e01600

Browse files
authored
Merge pull request #2864 from NickPapatonis/Issue_2860
#2860 Add partition ranges to columnstore visualization
2 parents 89f564e + a9ce162 commit 2e01600

1 file changed

Lines changed: 50 additions & 12 deletions

File tree

sp_BlitzIndex.sql

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ ALTER PROCEDURE dbo.sp_BlitzIndex
3434
@OutputTableName NVARCHAR(256) = NULL ,
3535
@IncludeInactiveIndexes BIT = 0 /* Will skip indexes with no reads or writes */,
3636
@ShowAllMissingIndexRequests BIT = 0 /*Will make all missing index requests show up*/,
37+
@ShowPartitionRanges BIT = 0 /* Will add partition range values column to columnstore visualization */,
3738
@SortOrder NVARCHAR(50) = NULL, /* Only affects @Mode = 2. */
3839
@SortDirection NVARCHAR(4) = 'DESC', /* Only affects @Mode = 2. */
3940
@Help TINYINT = 0,
@@ -126,6 +127,7 @@ DECLARE @LineFeed NVARCHAR(5);
126127
DECLARE @DaysUptimeInsertValue NVARCHAR(256);
127128
DECLARE @DatabaseToIgnore NVARCHAR(MAX);
128129
DECLARE @ColumnList NVARCHAR(MAX);
130+
DECLARE @PartitionCount INT;
129131

130132
/* Let's get @SortOrder set to lower case here for comparisons later */
131133
SET @SortOrder = REPLACE(LOWER(@SortOrder), N' ', N'_');
@@ -2753,6 +2755,7 @@ BEGIN
27532755
SELECT @ColumnList = @ColumnList + column_name + N'', ''
27542756
FROM DistinctColumns
27552757
ORDER BY column_id;
2758+
SELECT @PartitionCount = COUNT(1) FROM ' + QUOTENAME(@DatabaseName) + N'.sys.partitions WHERE object_id = @ObjectID AND data_compression IN (3,4);
27562759
END';
27572760

27582761
IF @Debug = 1
@@ -2769,27 +2772,62 @@ BEGIN
27692772
PRINT SUBSTRING(@dsql, 36000, 40000);
27702773
END;
27712774

2772-
EXEC sp_executesql @dsql, N'@ObjectID INT, @ColumnList NVARCHAR(MAX) OUTPUT', @ObjectID, @ColumnList OUTPUT;
2775+
EXEC sp_executesql @dsql, N'@ObjectID INT, @ColumnList NVARCHAR(MAX) OUTPUT, @PartitionCount INT OUTPUT', @ObjectID, @ColumnList OUTPUT, @PartitionCount OUTPUT;
2776+
2777+
IF @PartitionCount < 2
2778+
SET @ShowPartitionRanges = 0;
27732779

27742780
IF @Debug = 1
2775-
SELECT @ColumnList AS ColumnstoreColumnList;
2781+
SELECT @ColumnList AS ColumnstoreColumnList, @PartitionCount AS PartitionCount, @ShowPartitionRanges AS ShowPartitionRanges;
27762782

27772783
IF @ColumnList <> ''
27782784
BEGIN
27792785
/* Remove the trailing comma */
27802786
SET @ColumnList = LEFT(@ColumnList, LEN(@ColumnList) - 1);
27812787

2782-
SET @dsql = N'USE ' + QUOTENAME(@DatabaseName) + N'; SELECT partition_number, row_group_id, total_rows, deleted_rows, ' + @ColumnList + N'
2788+
SET @dsql = N'USE ' + QUOTENAME(@DatabaseName) + N';
2789+
SELECT partition_number, '
2790+
+ CASE WHEN @ShowPartitionRanges = 1 THEN N' COALESCE(range_start_op + '' '' + range_start + '' '', '''') + COALESCE(range_end_op + '' '' + range_end, '''') AS partition_range, ' ELSE N' ' END
2791+
+ N' row_group_id, total_rows, deleted_rows, '
2792+
+ @ColumnList
2793+
+ CASE WHEN @ShowPartitionRanges = 1 THEN N'
27832794
FROM (
2784-
SELECT c.name AS column_name, p.partition_number,
2785-
rg.row_group_id, rg.total_rows, rg.deleted_rows,
2786-
details = CAST(seg.min_data_id AS VARCHAR(20)) + '' to '' + CAST(seg.max_data_id AS VARCHAR(20)) + '', '' + CAST(CAST((seg.on_disk_size / 1024.0 / 1024) AS DECIMAL(18,0)) AS VARCHAR(20)) + '' MB''
2787-
FROM ' + QUOTENAME(@DatabaseName) + N'.sys.column_store_row_groups rg
2788-
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.columns c ON rg.object_id = c.object_id
2789-
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partitions p ON rg.object_id = p.object_id AND rg.partition_number = p.partition_number
2790-
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.index_columns ic on ic.column_id = c.column_id AND ic.object_id = c.object_id AND ic.index_id = p.index_id
2791-
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.column_store_segments seg ON p.partition_id = seg.partition_id AND ic.index_column_id = seg.column_id AND rg.row_group_id = seg.segment_id
2792-
WHERE rg.object_id = @ObjectID
2795+
SELECT column_name, partition_number, row_group_id, total_rows, deleted_rows, details,
2796+
range_start_op,
2797+
CASE
2798+
WHEN format_type IS NULL THEN CAST(range_start_value AS NVARCHAR(4000))
2799+
ELSE CONVERT(NVARCHAR(4000), range_start_value, format_type) END range_start,
2800+
range_end_op,
2801+
CASE
2802+
WHEN format_type IS NULL THEN CAST(range_end_value AS NVARCHAR(4000))
2803+
ELSE CONVERT(NVARCHAR(4000), range_end_value, format_type) END range_end' ELSE N' ' END + N'
2804+
FROM (
2805+
SELECT c.name AS column_name, p.partition_number, rg.row_group_id, rg.total_rows, rg.deleted_rows,
2806+
details = CAST(seg.min_data_id AS VARCHAR(20)) + '' to '' + CAST(seg.max_data_id AS VARCHAR(20)) + '', '' + CAST(CAST((seg.on_disk_size / 1024.0 / 1024) AS DECIMAL(18,0)) AS VARCHAR(20)) + '' MB'''
2807+
+ CASE WHEN @ShowPartitionRanges = 1 THEN N',
2808+
CASE
2809+
WHEN pp.system_type_id IN (40, 41, 42, 43, 58, 61) THEN 126
2810+
WHEN pp.system_type_id IN (59, 62) THEN 3
2811+
WHEN pp.system_type_id IN (60, 122) THEN 2
2812+
ELSE NULL END format_type,
2813+
CASE WHEN pf.boundary_value_on_right = 0 THEN ''>'' ELSE ''>='' END range_start_op,
2814+
prvs.value range_start_value,
2815+
CASE WHEN pf.boundary_value_on_right = 0 THEN ''<='' ELSE ''<'' END range_end_op,
2816+
prve.value range_end_value ' ELSE N' ' END + N'
2817+
FROM ' + QUOTENAME(@DatabaseName) + N'.sys.column_store_row_groups rg
2818+
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.columns c ON rg.object_id = c.object_id
2819+
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partitions p ON rg.object_id = p.object_id AND rg.partition_number = p.partition_number
2820+
INNER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.index_columns ic on ic.column_id = c.column_id AND ic.object_id = c.object_id AND ic.index_id = p.index_id ' + CASE WHEN @ShowPartitionRanges = 1 THEN N'
2821+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.indexes i ON i.object_id = rg.object_id AND i.index_id = rg.index_id
2822+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partition_schemes ps ON ps.data_space_id = i.data_space_id
2823+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partition_functions pf ON pf.function_id = ps.function_id
2824+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partition_parameters pp ON pp.function_id = pf.function_id
2825+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partition_range_values prvs ON prvs.function_id = pf.function_id AND prvs.boundary_id = p.partition_number - 1
2826+
LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.partition_range_values prve ON prve.function_id = pf.function_id AND prve.boundary_id = p.partition_number ' ELSE N' ' END
2827+
+ N' LEFT OUTER JOIN ' + QUOTENAME(@DatabaseName) + N'.sys.column_store_segments seg ON p.partition_id = seg.partition_id AND ic.index_column_id = seg.column_id AND rg.row_group_id = seg.segment_id
2828+
WHERE rg.object_id = @ObjectID'
2829+
+ CASE WHEN @ShowPartitionRanges = 1 THEN N'
2830+
) AS y ' ELSE N' ' END + N'
27932831
) AS x
27942832
PIVOT (MAX(details) FOR column_name IN ( ' + @ColumnList + N')) AS pivot1
27952833
ORDER BY partition_number, row_group_id;';

0 commit comments

Comments
 (0)