Last active
August 7, 2024 20:04
-
-
Save michaellwest/9a9a7b78ac4f1a3463fe3d59ad5455f2 to your computer and use it in GitHub Desktop.
Count and remove the unused blobs for Sitecore 10.2. Replaces the use of https://gist.github.com/michaellwest/51f4bcaf93400649b5482cf061d0e869
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Modified version of the cleanup script provided by Sitecore Support. This version runs with a counter to help run in small batches. */ | |
create table #UnusedBlobIDs ( | |
ID UNIQUEIDENTIFIER PRIMARY KEY (ID) | |
); | |
WITH [ExistingBlobs] ([BlobId]) AS ( | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [ArchivedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [ArchivedFields].[Value] | |
) | |
INSERT INTO #UnusedBlobIDs (ID) SELECT DISTINCT [Blobs].[BlobId] | |
FROM [Blobs] | |
WHERE NOT EXISTS | |
( | |
SELECT NULL | |
FROM [ExistingBlobs] | |
WHERE [ExistingBlobs].[BlobId] = [Blobs].[BlobId] | |
) | |
DECLARE @r INT; | |
DECLARE @batchsize INT; | |
DECLARE @counter INT; | |
SET @r = 1; | |
SET @batchsize=1000; | |
SET @counter = 0 | |
WHILE (@r > 0 AND @counter < 10000) | |
BEGIN | |
BEGIN TRANSACTION; | |
DELETE TOP (@batchsize) FROM [Blobs] where [Blobs].[BlobId] IN (SELECT ID from #UnusedBlobIDs); | |
SET @r = @@ROWCOUNT; | |
SET @counter = @counter + @r | |
COMMIT TRANSACTION; | |
END | |
DROP TABLE #UnusedBlobIDs; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Count all the rows in the Blobs table. Considerably faster than SELECT COUNT(1) FROM [Blobs] */ | |
SELECT | |
Total_Rows= SUM(st.row_count) | |
FROM | |
sys.dm_db_partition_stats st | |
WHERE | |
object_name(object_id) = 'Blobs' AND (index_id < 2) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Returns the count of unused blobs both in total and a unique list. */ | |
WITH [ExistingBlobs] ([BlobId]) AS ( | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [ArchivedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [ArchivedFields].[Value] | |
) | |
SELECT | |
COUNT([Blobs].[BlobId]) as [UnusedCount], | |
COUNT(DISTINCT [Blobs].[BlobId]) as [UnusedDistinctCount] | |
FROM [Blobs] | |
LEFT JOIN [ExistingBlobs] ON [Blobs].[BlobId] = [ExistingBlobs].[BlobId] | |
WHERE [ExistingBlobs].[BlobId] IS NULL |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DECLARE @r INT; | |
DECLARE @batchsize INT; | |
SET @r = 1; | |
SET @batchsize=1000; | |
create table #UnusedBlobIDs ( | |
ID UNIQUEIDENTIFIER PRIMARY KEY (ID) | |
); | |
WITH [ExistingBlobs] ([BlobId]) AS ( | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [SharedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [SharedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [VersionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [VersionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [UnversionedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [UnversionedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON '{' + CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) + '}' = [ArchivedFields].[Value] | |
UNION | |
SELECT [Blobs].[BlobId] | |
FROM [Blobs] | |
JOIN [ArchivedFields] | |
ON CONVERT(NVARCHAR(MAX), [Blobs].[BlobId]) = [ArchivedFields].[Value] | |
) | |
INSERT INTO #UnusedBlobIDs (ID) SELECT DISTINCT [Blobs].[BlobId] | |
FROM [Blobs] | |
WHERE NOT EXISTS | |
( | |
SELECT NULL | |
FROM [ExistingBlobs] | |
WHERE [ExistingBlobs].[BlobId] = [Blobs].[BlobId] | |
) | |
WHILE @r > 0 | |
BEGIN | |
BEGIN TRANSACTION; | |
DELETE TOP (@batchsize) FROM [Blobs] where [Blobs].[BlobId] IN (SELECT ID from #UnusedBlobIDs); | |
SET @r = @@ROWCOUNT; | |
COMMIT TRANSACTION; | |
END | |
DROP TABLE #UnusedBlobIDs; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment