In Oracle databases there is a table that allows to list all the tables in the database (table 'dba_tables') and we can use this 'dba_tables' to create maintenance scripts dynamically. In SQL Server we can create also scripts of tables maintenace by querying the table [dataBase].dbo.sysobjects.
In the example below we use a T-SQL script to update statistics for all tables in a SQL Server database by querying dynamically the data dictionary (using the table dbo.sysobjects). This T-SQL code can be encapsulated in a stored procedure or in a job to be executed by the SQL Server Agent to automatically keep statistics updated on all tables of the dbo scheme in a SQL Server database.
Update statistics from all tables of the 'dbo' scheme on a SQL Server database
-- Declaration of variables
DECLARE @dbName sysname
DECLARE @sample int
DECLARE @SQL nvarchar(4000)
DECLARE @ID int
DECLARE @Table sysname
DECLARE @RowCnt int
-- Filter by database and percentage for recalculation of statistics
SET @dbName = 'AdventureWorks2008'
SET @sample = 100
--Temporary Table
CREATE TABLE ##Tables
(
TableID INT IDENTITY(1, 1) NOT NULL,
TableName SYSNAME NOT NULL
)
--We feed the table with the list of tables
SET @SQL = ''
SET @SQL = @SQL + 'INSERT INTO ##Tables (TableName) '
SET @SQL = @SQL + 'SELECT [name] FROM ' + @dbName + '.dbo.sysobjects WHERE xtype = ''U'' AND [name] <> ''dtproperties'''
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Table = TableName
FROM ##Tables
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
-- For each table
WHILE @RowCnt <> 0
BEGIN
SET @SQL = 'UPDATE STATISTICS ' + @dbname + '.dbo.[' + @Table + '] WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT'
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Table = TableName
FROM ##Tables
WHERE TableID > @ID
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
END
--Drop the temporal table
DROP TABLE ##Tables
[[ad]]
Update statistics from all tables of all schemes on a SQL Server database
But if we have tables in schemes different than the dbo this script woud fail for this tables contained in other schemas. Another version of the script, that update all the table statistics in a SQLServer Database for all the tables, for the dbo scheme and for all other schemes is: (changes in red)
-- Declaration of variables
DECLARE @dbName sysname
DECLARE @sample int
DECLARE @SQL nvarchar(4000)
DECLARE @ID int
DECLARE @Table sysname
DECLARE @RowCnt int
-- Filter by database and percentage for recalculation of statistics
SET @dbName = 'AdventureWorks2008'
SET @sample = 100
--Temporary Table
CREATE TABLE ##Tables
(
TableID INT IDENTITY(1, 1) NOT NULL,
TableName SYSNAME NOT NULL
)
--We feed the table with the list of tables of all schemas
SET @SQL = ''
SET @SQL = 'INSERT INTO ##Tablas(TableName) '
SET @SQL = @SQL + ' select ''['' + TABLE_CATALOG + ''].['' + TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' from INFORMATION_SCHEMA.TABLES'
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Table = TableName
FROM ##Tables
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
-- For each table
WHILE @RowCnt <> 0
BEGIN
-- Update statistics using only the table name
SET @SQL = 'UPDATE STATISTICS ' + @Tabla + ' WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT'
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Table = TableName
FROM ##Tables
WHERE TableID > @ID
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
END
--Drop the temporal table
DROP TABLE ##Tables