テンポラルテーブル内の履歴レコードにアクセスすると、奇妙な問題が発生します。AS OF副次句を介してテンポラルテーブルの古いエントリにアクセスするクエリは、最近の履歴エントリのクエリよりも時間がかかります。
履歴テーブルはSQL Serverによって生成され(日付列にクラスター化インデックスが含まれ、ページ圧縮を使用)、履歴テーブルに5,000万行を追加しました。クエリは約25,000行を取得しました。
問題の根本的な原因を特定しようとしましたが、特定できませんでした。これまでにテストしました:
- クラスター化インデックスを含む5,000万行のテストテーブルを作成して、速度の低下が単にボリュームによるものかどうかを確認します。一定の時間(約400ミリ秒)で25K行を取得できました。
- 履歴テーブルからページ圧縮を削除します。これは検索時間には影響しませんでしたが、テーブルのサイズを大幅に増やしました。
- ID列と日付列を使用して、履歴テーブルの行に直接アクセスしてみました。ここが少し面白かった場所です。AS OFサブ句の場合と同様に、約1200ミリ秒かかるテーブルの約400ミリ秒で、古い行にアクセスできました。テストテーブルで日付列のフィルタリングを試みたところ、ID列でのフィルタリングと比較して、同様の速度低下に気づきました。これは、日付の比較がいくつかの減速の背後にあると私に信じさせます。
私はこれをもっと見たいのですが、間違った木を吠えないようにしたいのです。まず、テンポラルテーブルの古い履歴データにアクセスするときに、他の誰かがこれと同じ動作を経験しましたか?次に、パフォーマンスの問題の根本原因をさらに特定するために使用できるいくつかの戦略は何ですか(実行プランを調べ始めたばかりですが、それでも私には少し謎めいています)。
実行計画
これらは単純な取得クエリです。最初のクエリは古い行にアクセスし、2番目のクエリは新しい行にアクセスします。
古い行:実行時間〜1200ms
最近の行〜350msの実行時間
テーブルの詳細
これらはテンポラルテーブルの列です。履歴テーブルには同じ列がありますが、(履歴テーブルの要件に従って)主キーはありません。