Olaのスクリプトを使用してインデックスの最適化を行い、特定のスキーマを除外することはできますか?
はい、 documentation を見ると、@indexes
パラメータを使用して、最適化するインデックスを指定できることがわかります。オブジェクト名には%
ワイルドカードを使用でき、それらの前に-
を付けてインデックスを除外できます。
この情報を使用すると、使用する構文は@indexes = 'ALL_INDEXES, -databasename.excludedschema.%'
、またはすべてのデータベースのスキーマを除外する場合は@indexes = 'ALL_INDEXES, -%.excludedschema.%'
になります。
以下に、これを文書化した再現を示します。
まず、2つの断片化されたテーブルを持つデータベースを作成します。1つはdbo
スキーマに、もう1つはExclusion
というスキーマに作成します。どちらも約99%断片化されているはずです。
USE [master];
GO
CREATE DATABASE [196090];
GO
USE [196090];
GO
SET NOCOUNT ON;
GO
-- Create a table in dbo schema
CREATE TABLE [ProdTable] (
[c1] INT,
[c2] CHAR (5000) DEFAULT 'production');
CREATE CLUSTERED INDEX [prod_cl] ON [ProdTable] ([c1]);
GO
-- Fill with random integers to create fragmentation
INSERT INTO [ProdTable] (c1, c2) VALUES (CRYPT_GEN_RANDOM(8000), 'filler');
GO 12800
-- Check the fragmentation of the production table
SELECT
[avg_fragmentation_in_percent]
FROM sys.dm_db_index_physical_stats (
DB_ID (N'196090'), OBJECT_ID (N'ProdTable'), 1, NULL, 'LIMITED');
GO
-- Create a schema to exclude from the rebuild
CREATE SCHEMA Exclusion;
GO
-- Fill with random integers to create fragmentation
CREATE TABLE [Exclusion].[ProdTableExclude] (
[c1] INT,
[c2] CHAR (5000) DEFAULT 'production');
CREATE CLUSTERED INDEX [prod_cl] ON [Exclusion].[ProdTableExclude] ([c1]);
GO
INSERT INTO [Exclusion].[ProdTableExclude] VALUES (CRYPT_GEN_RANDOM(8000), 'filler');
GO 12800
-- Check the fragmentation of the production table
SELECT
[avg_fragmentation_in_percent]
FROM sys.dm_db_index_physical_stats (
DB_ID (N'196090'), OBJECT_ID (N'Exclusion.ProdTableExclude'), 1, NULL, 'LIMITED');
GO
次に、Olaのインデックスメンテナンスを次のように実行します。
EXECUTE dbo.IndexOptimize
@Databases = '196090',
@indexes = 'ALL_INDEXES, -196090.Exclusion.%'
そして、スクリプトがスキーマをスキップし、インデックスの1つが断片化されたままになることに気づくでしょう。