まず、私はFirebirdの専門家ではないことを指摘しておきます。だから、SQL Serverの仕組みに基づいて答えています。
この場合、答えは「はい」と「いいえ」の両方です。
新しい行を挿入すると、そのテーブルのすべてのインデックスにその行が格納されるため、インデックスがSQL Server上で更新されます。基本的に、そのパーツが動作するためにテーブルを再インデックス化し続ける必要はありません。それは「いいえ」の部分です。
ただし、問題はインデックスではなく、統計情報で示されます。あなたはテーブルのインデックスを再作成する必要があると言っていますが、統計を操作するコードを表示しているので、その理由がわかります。
簡単な答えは、時間が経つにつれて統計がゆっくりと外に出るということです。それらは使用できなくなるまで悪化することはありませんが、再作成/再計算する際の完全なレベルから低下します。それは「はい」の部分です。
古い統計の主な問題は、インデックス内のキーの分布が大幅に変更された場合、統計が直ちにそのインデックスを取得しない可能性があるため、クエリオプティマイザは古いインデックス、古くなった統計データを手元に持っています。
例えば、インデックスの1つが、キーが値のスペースの両端に集約されているという統計があるとします(たとえば、0と1のロットが多いint-column)。次に、たくさんの行を挿入して、このインデックスに値全体がスペクトル全体に広がるようにする値を挿入します。
このインデックスを持つテーブルに対して選択性の低い(0と1が多い)列で、別のテーブルの結合を使用するクエリを実行すると、クエリオプティマイザはこのインデックスがこれは、同時に使用される(同じデータページ上にある)多くの行をフェッチするためです。
しかし、データが変更されているため、関連する部分を見つけるためにインデックス全体にジャンプします。結局のところそれほど良くありません。
統計を再計算した後、クエリオプティマイザは、このインデックスがこのクエリに対して最適ではないことを確認し、代わりに別のインデックスを選択することができます。
基本的に、データが流動的である場合は、定期的に統計を再計算する必要があります。データがほとんど変更されない場合は、頻繁に行う必要はありませんが、これを行う定期的なメンテナンスジョブを追加します。
Firebirdに単独でそれを依頼することができるかどうかについては、やはり私は薄い氷の上にいるのですが、私はそこにいると疑います。 SQL Serverでは、これをスケジュールで実行するメンテナンスジョブを設定することができます。少なくとも、Windowsスケジューラからバッチファイルを取り出して、そのような処理を行うことができるはずです。
ちょっとメモ。 SUSPENDはこの手順では不要です。 –
ありがとう!私はそれをどこかからコピーしたと思う。 – pablo
実際に、索引統計は再索引付けされず、再計算されません。大きな表では、再索引付けが非常に遅くなることがあります。統計の計算は常に迅速です。 –