web-dev-qa-db-ja.com

インデックス最適化スクリプトのスキーマのフィルター

Olaのスクリプトを使用してインデックスの最適化を行い、特定のスキーマを除外することはできますか?

3
MaricopaJoe

はい、 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つが断片化されたままになることに気づくでしょう。