Objective: To create indexing script automatically and then apply Or Execute directly through this Procedure.
Step I:
First Create Table for inserting table name in to this table for our Indexing purpose.
Step I:
First Create Table for inserting table name in to this table for our Indexing purpose.
USE [dbmonitor]
GO
GO
/****** Object: Table [dbo].[T_TableReindexing] Script Date: 06/18/2009 14:12:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_TableReindexing](
[DatabaseName] [varchar](255) NULL,
[Owner] [varchar](255) NULL,
[TableName] [varchar](255) NULL,
[Status] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[T_TableReindexing] ADD DEFAULT ((1)) FOR [Status]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_TableReindexing](
[DatabaseName] [varchar](255) NULL,
[Owner] [varchar](255) NULL,
[TableName] [varchar](255) NULL,
[Status] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[T_TableReindexing] ADD DEFAULT ((1)) FOR [Status]
GO
Table Structure for storing Database, owner, Tablename, Status.
How to Insert Data into the above mentioned table
Step II:
Populate the table into [T_TableReindexing]
Insert into T_TableReindexing (DatabaseName,Owner,TableName)
Select TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.TABLES Where table_type='Base Table'
Step III:
This is the procedure to have all scripts for Indexing. You can also execute directly by allowing execution in Exec (@cmd) in this procedure, which is already commented.
CREATE PROCEDURE P_ReIndexDatabaseV1
AS
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 90
DECLARE DatabaseCursor CURSOR FOR
SELECT [SDB].[name] FROM master.dbo.sysdatabases AS [SDB]
WHERE [SDB].[name] collate database_default IN (SELECT DISTINCT [RI].[DatabaseName] FROM T_TableReindexing AS [RI](nolock))
ORDER BY 1
OPEN DatabaseCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT table_catalog + ''.'' + table_schema + ''.'' + table_name as tableName
FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES INNER JOIN T_TableReindexing AS [RI](nolock) ON table_catalog collate database_default = [RI].[DatabaseName] AND [TABLE_NAME] collate database_default =[RI].[TableName] AND [RI].[STATUS]=1'
EXEC (@cmd)
Print (@cmd)
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @Table
WHILE @@FETCH_STATUS = 0
BEGIN
-- SQL 2000 command
--DBCC DBREINDEX(@Table,' ',@fillfactor)
-- SQL 2005 command
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ', ONLINE = ON )' PRINT @cmd
--EXEC (@cmd)
FETCH NEXT FROM TableCursor INTO @Table
END
CLOSE TableCursor
DEALLOCATE TableCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor
Step II:
Populate the table into [T_TableReindexing]
Insert into T_TableReindexing (DatabaseName,Owner,TableName)
Select TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.TABLES Where table_type='Base Table'
Step III:
This is the procedure to have all scripts for Indexing. You can also execute directly by allowing execution in Exec (@cmd) in this procedure, which is already commented.
CREATE PROCEDURE P_ReIndexDatabaseV1
AS
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 90
DECLARE DatabaseCursor CURSOR FOR
SELECT [SDB].[name] FROM master.dbo.sysdatabases AS [SDB]
WHERE [SDB].[name] collate database_default IN (SELECT DISTINCT [RI].[DatabaseName] FROM T_TableReindexing AS [RI](nolock))
ORDER BY 1
OPEN DatabaseCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT table_catalog + ''.'' + table_schema + ''.'' + table_name as tableName
FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES INNER JOIN T_TableReindexing AS [RI](nolock) ON table_catalog collate database_default = [RI].[DatabaseName] AND [TABLE_NAME] collate database_default =[RI].[TableName] AND [RI].[STATUS]=1'
EXEC (@cmd)
Print (@cmd)
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @Table
WHILE @@FETCH_STATUS = 0
BEGIN
-- SQL 2000 command
--DBCC DBREINDEX(@Table,' ',@fillfactor)
-- SQL 2005 command
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ', ONLINE = ON )' PRINT @cmd
--EXEC (@cmd)
FETCH NEXT FROM TableCursor INTO @Table
END
CLOSE TableCursor
DEALLOCATE TableCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor

No comments:
Post a Comment