リンクデータベースのクエリ実行時間を短縮する方法


詳細

Linksテーブルに対するクエリを実行する際に、CPUとDTUの消費量が増加する場合があります。その場合、リンク データベースへのアクセスを必要とする操作に、遅延が生じる傾向が見られます。この記事では、LinksテーブルにSQLインデックスを作成することで、リンク データベースのクエリ実行時間を短縮する方法をご紹介します。

ソリューション

Linkデータベースのクエリ実行時間を短縮する方法として、下記5点の手順をお勧めします。

  1. Linksテーブルを格納するのに使用するデータベースの名称を決定します。デフォルトでは、これは設定の defaultLinkDatabaseConnectionStringName変数によって決定されます。これ以降の手順のスクリプトは、Linksテーブルが格納されているデータベースに対して実行してください。
  2. 次に、データベースのバックアップを作成します。この手順を実施するかは任意となりますが、データベースのスキーマに変更を加える場合には実施していただくのがベスト プラクティスであると考えられます。
    注意事項: リンク データベースは、一から再構築することができます。リンク データベースを再構築する場合は、下記の手順で行います。
    1. はじめに、SitecoreのLaunchpad内にあるコントロール パネルをクリックします。
    2. 次にデータベースのタブにあるリンク データベースを再構築するをクリックし、すべてのデータベースにチェックを入れます。
    3. 最後に、再構築をクリックします。
  3. データベースのLinksテーブル上にあるTargetPath列のタイプを変更します。
    ALTER TABLE [Links] ALTER COLUMN TargetPath NVARCHAR(MAX) NOT NULL
  4. データベースのLinksテーブルに、新しく2つのSQLインデックスを作成します。
    CREATE NONCLUSTERED INDEX [ndxSourceItemIdSourceDatabase] ON [dbo].[Links]
    (
    [SourceItemID] ASC,
    [SourceDatabase] ASC
    )
    INCLUDE ([TargetDatabase],[TargetItemId],[SourceLanguage],[SourceVersion],[SourceFieldID],[TargetLanguage],[TargetVersion],[TargetPath])
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO
    CREATE NONCLUSTERED INDEX [ndxTargetItemIdTargetDatabase] ON [dbo].[Links]
    (
    [TargetItemId] ASC,
    [TargetDatabase] ASC
    )
    INCLUDE ([SourceDatabase],[SourceItemID],[SourceLanguage],[SourceVersion],[SourceFieldID],[TargetLanguage],[TargetVersion],[TargetPath])
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO
  5. データベース上のLinksテーブルから、ndxSourceItemIDndxTargetItemIDのSQLインデックスを削除します。

備考: これらの手順は、多くの環境においてクエリの実行時間を短縮することができますが、本番環境の実施前に、テスト環境下で変更内容をテストすることをお勧めします。これは、インデックスの維持コスト(データ変更時のインデックス更新)が、クエリのパフォーマンス向上を上回らないようにするためです。