Skip to content

Commit c05bce1

Browse files
Merge pull request #722 from erikdarlingdata/fix/indexcleanup-uc-subset-and-schema-join
sp_IndexCleanup: fix #721 unique constraint subset + replace ISNULL schema join
2 parents 056f18c + eef41bc commit c05bce1

1 file changed

Lines changed: 31 additions & 54 deletions

File tree

sp_IndexCleanup/sp_IndexCleanup.sql

Lines changed: 31 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,9 +1447,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14471447
schema_id = s.schema_id,
14481448
schema_name = s.name,
14491449
object_id = i.object_id,
1450-
table_name = ISNULL(t.name, v.name),
1450+
table_name = o.name,
14511451
index_id = i.index_id,
1452-
index_name = ISNULL(i.name, ISNULL(t.name, v.name) + N''.Heap''),
1452+
index_name = ISNULL(i.name, o.name + N''.Heap''),
14531453
can_compress =
14541454
CASE
14551455
WHEN p.index_id > 0
@@ -1458,20 +1458,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14581458
ELSE 0
14591459
END
14601460
FROM ' + QUOTENAME(@current_database_name) + N'.sys.indexes AS i
1461-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.tables AS t
1462-
ON i.object_id = t.object_id
1463-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.views AS v
1464-
ON i.object_id = v.object_id
1461+
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.objects AS o
1462+
ON i.object_id = o.object_id
14651463
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.schemas AS s
1466-
ON ISNULL(t.schema_id, v.schema_id) = s.schema_id
1464+
ON o.schema_id = s.schema_id
14671465
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.partitions AS p
14681466
ON i.object_id = p.object_id
14691467
AND i.index_id = p.index_id
14701468
/* LEFT JOIN to dm_db_index_usage_stats removed 2026-01-15 - was dead code with no columns selected */
1471-
WHERE (t.object_id IS NULL OR t.is_ms_shipped = 0)
1472-
AND (t.object_id IS NULL OR t.type <> N''TF'')
1473-
AND i.is_disabled = 0
1474-
AND i.is_hypothetical = 0';
1469+
WHERE o.is_ms_shipped = 0
1470+
AND o.type IN (N''U'', N''V'')
1471+
AND i.is_disabled = 0
1472+
AND i.is_hypothetical = 0';
14751473

14761474
IF @supports_temporal_tables = 1
14771475
BEGIN
@@ -1971,9 +1969,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19711969
schema_id = s.schema_id,
19721970
schema_name = s.name,
19731971
os.object_id,
1974-
table_name = ISNULL(t.name, v.name),
1972+
table_name = o.name,
19751973
os.index_id,
1976-
index_name = ISNULL(i.name, ISNULL(t.name, v.name) + N''.Heap''),
1974+
index_name = ISNULL(i.name, o.name + N''.Heap''),
19771975
range_scan_count = SUM(os.range_scan_count),
19781976
singleton_lookup_count = SUM(os.singleton_lookup_count),
19791977
forwarded_fetch_count = SUM(os.forwarded_fetch_count),
@@ -2011,12 +2009,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20112009
NULL,
20122010
NULL
20132011
) AS os
2014-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.tables AS t
2015-
ON os.object_id = t.object_id
2016-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.views AS v
2017-
ON os.object_id = v.object_id
2012+
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.objects AS o
2013+
ON os.object_id = o.object_id
20182014
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.schemas AS s
2019-
ON ISNULL(t.schema_id, v.schema_id) = s.schema_id
2015+
ON o.schema_id = s.schema_id
20202016
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.indexes AS i
20212017
ON os.object_id = i.object_id
20222018
AND os.index_id = i.index_id
@@ -2034,7 +2030,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20342030
s.schema_id,
20352031
s.name,
20362032
os.object_id,
2037-
ISNULL(t.name, v.name),
2033+
o.name,
20382034
os.index_id,
20392035
i.name
20402036
OPTION(RECOMPILE);
@@ -2188,24 +2184,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21882184
i.index_id,
21892185
s.schema_id,
21902186
schema_name = s.name,
2191-
table_name = ISNULL(t.name, v.name),
2192-
index_name = ISNULL(i.name, ISNULL(t.name, v.name) + N''.Heap''),
2187+
table_name = o.name,
2188+
index_name = ISNULL(i.name, o.name + N''.Heap''),
21932189
column_name = c.name,
21942190
column_id = c.column_id,
21952191
i.is_primary_key,
21962192
i.is_unique,
21972193
i.is_unique_constraint,
21982194
is_indexed_view =
21992195
CASE
2200-
WHEN EXISTS
2201-
(
2202-
SELECT
2203-
1/0
2204-
FROM ' + QUOTENAME(@current_database_name) + N'.sys.objects AS so
2205-
WHERE i.object_id = so.object_id
2206-
AND so.is_ms_shipped = 0
2207-
AND so.type = ''V''
2208-
)
2196+
WHEN o.type = ''V''
22092197
THEN 1
22102198
ELSE 0
22112199
END,
@@ -2282,12 +2270,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22822270
THEN 0
22832271
END
22842272
FROM ' + QUOTENAME(@current_database_name) + N'.sys.indexes AS i
2285-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.tables AS t
2286-
ON i.object_id = t.object_id
2287-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.views AS v
2288-
ON i.object_id = v.object_id
2273+
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.objects AS o
2274+
ON i.object_id = o.object_id
22892275
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.schemas AS s
2290-
ON ISNULL(t.schema_id, v.schema_id) = s.schema_id
2276+
ON o.schema_id = s.schema_id
22912277
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.index_columns AS ic
22922278
ON i.object_id = ic.object_id
22932279
AND i.index_id = ic.index_id
@@ -2301,7 +2287,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23012287
LEFT JOIN #usage_stats AS us
23022288
ON i.object_id = us.object_id
23032289
AND i.index_id = us.index_id
2304-
WHERE (t.object_id IS NULL OR t.is_ms_shipped = 0)
2290+
WHERE o.is_ms_shipped = 0
2291+
AND o.type IN (N''U'', N''V'')
23052292
AND i.type IN (1, 2)
23062293
AND i.is_disabled = 0
23072294
AND i.is_hypothetical = 0
@@ -2466,8 +2453,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24662453
ps.index_id,
24672454
s.schema_id,
24682455
schema_name = s.name,
2469-
table_name = ISNULL(t.name, v.name),
2470-
index_name = ISNULL(i.name, ISNULL(t.name, v.name) + N''.Heap''),
2456+
table_name = o.name,
2457+
index_name = ISNULL(i.name, o.name + N''.Heap''),
24712458
ps.partition_id,
24722459
p.partition_number,
24732460
total_rows = ps.row_count,
@@ -2477,20 +2464,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24772464
p.data_compression_desc,
24782465
i.data_space_id
24792466
FROM ' + QUOTENAME(@current_database_name) + N'.sys.indexes AS i
2480-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.tables AS t
2481-
ON i.object_id = t.object_id
2482-
LEFT JOIN ' + QUOTENAME(@current_database_name) + N'.sys.views AS v
2483-
ON i.object_id = v.object_id
2467+
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.objects AS o
2468+
ON i.object_id = o.object_id
24842469
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.schemas AS s
2485-
ON ISNULL(t.schema_id, v.schema_id) = s.schema_id
2470+
ON o.schema_id = s.schema_id
24862471
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.partitions AS p
24872472
ON i.object_id = p.object_id
24882473
AND i.index_id = p.index_id
24892474
JOIN ' + QUOTENAME(@current_database_name) + N'.sys.allocation_units AS a
24902475
ON p.partition_id = a.container_id
24912476
LEFT HASH JOIN ' + QUOTENAME(@current_database_name) + N'.sys.dm_db_partition_stats AS ps
24922477
ON p.partition_id = ps.partition_id
2493-
WHERE (t.object_id IS NULL OR t.type <> N''TF'')
2478+
WHERE o.type IN (N''U'', N''V'')
24942479
AND i.type IN (1, 2)
24952480
AND EXISTS
24962481
(
@@ -2519,7 +2504,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25192504
ps.index_id,
25202505
s.schema_id,
25212506
s.name,
2522-
ISNULL(t.name, v.name),
2507+
o.name,
25232508
i.name,
25242509
ps.partition_id,
25252510
p.partition_number,
@@ -3233,7 +3218,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32333218
AND NOT (ia1.is_unique = 1 AND ia2.is_unique = 0)
32343219
WHERE ia1.consolidation_rule IS NULL /* Not already processed */
32353220
AND ia2.consolidation_rule IS NULL /* Not already processed */
3236-
/* Exclude unique constraints - we'll handle those separately in Rule 7 */
3221+
/* Don't disable unique constraints — but allow them as the wider (target) index */
32373222
AND NOT EXISTS
32383223
(
32393224
SELECT
@@ -3242,14 +3227,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32423227
WHERE id1_uc.index_hash = ia1.index_hash
32433228
AND id1_uc.is_unique_constraint = 1
32443229
)
3245-
AND NOT EXISTS
3246-
(
3247-
SELECT
3248-
1/0
3249-
FROM #index_details AS id2_uc
3250-
WHERE id2_uc.index_hash = ia2.index_hash
3251-
AND id2_uc.is_unique_constraint = 1
3252-
)
32533230
AND EXISTS
32543231
(
32553232
SELECT

0 commit comments

Comments
 (0)