This is a technique that I am using from Paul Randal – concept of splitting CHECKDB: CHECKALLOC, CHECKCATALOG and CHECKTABLE – here we will use “buckets” of tables split across the week.
http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/10/20/consistency-checking-options-for-a-vldb.aspx
Lets assume Adventureworks is a VLDB 🙂
Day 1 would be the below
USE AdventureWorks2012
GO
DBCC CHECKALLOC
GO
DBCC CHECKCATALOG
GO
Now lets take 1 bucket of tables for day 1 for CHECKTABLE.
SELECT ''+SCHEMA_NAME(schema_id)+'.'+name+''
AS TableName, NTILE(7)
OVER (ORDER BY Name)
AS [BUCKET] INTO ##CHECKTABLE
FROM sys.tables WHERE type = 'U'
DECLARE @TABLE NVARCHAR(100)
DECLARE @SQL NVARCHAR(MAX)
DECLARE CHECKTABLE CURSOR FAST_FORWARD
FOR
SELECT TableName FROM ##CHECKTABLE
WHERE BUCKET = 1
OPEN CHECKTABLE
FETCH NEXT FROM CHECKTABLE INTO @TABLE
WHILE @@FETCH_STATUS=0
BEGIN
BEGIN TRY
SET @SQL = 'DBCC CHECKTABLE(''' + @TABLE + ''') '
PRINT @SQL
EXEC SP_EXECUTESQL @SQL
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (
@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
) WITH LOG;
END CATCH
FETCH NEXT FROM CHECKTABLE INTO @TABLE
end
CLOSE CHECKTABLE
DEALLOCATE CHECKTABLE
DBCC CHECKTABLE('Person.Address')
DBCC CHECKTABLE('Person.AddressType')
DBCC CHECKTABLE('dbo.AWBuildVersion')
DBCC CHECKTABLE('Production.BillOfMaterials')
DBCC CHECKTABLE('Person.BusinessEntity')
DBCC CHECKTABLE('Person.BusinessEntityAddress')
DBCC CHECKTABLE('Person.BusinessEntityContact')
DBCC CHECKTABLE('Person.ContactType')
DBCC CHECKTABLE('Person.CountryRegion')
DBCC CHECKTABLE('Sales.CountryRegionCurrency')
DBCC CHECKTABLE('Sales.CreditCard')
Then the 2nd day you could do the 2nd bucket. etc…