Informix で適用可能なインデックスがない非常に大きなテーブルで選択を実行しようとしています。残念ながら、このプロジェクトが完了するまでに適切なインデックスを追加することはできません。データベースの変更には厳格な手順があり、組織で必要な承認を得るには時間がかかりすぎます。
テーブルは断片化されており、以前に Oracle データベースの特定のパーティションから選択したことがあります。SELECT
クエリでフラグメントを指定する方法はありますか?
Informix で適用可能なインデックスがない非常に大きなテーブルで選択を実行しようとしています。残念ながら、このプロジェクトが完了するまでに適切なインデックスを追加することはできません。データベースの変更には厳格な手順があり、組織で必要な承認を得るには時間がかかりすぎます。
テーブルは断片化されており、以前に Oracle データベースの特定のパーティションから選択したことがあります。SELECT
クエリでフラグメントを指定する方法はありますか?
間接的にだけ...
パーティショニングで使用された式に基づいて、選択する行の一部が検索基準によって識別される場合、Informix は「フラグメントの削除」を実行して、回答に寄与できない可能性のあるパーティション (フラグメント) のスキャンを回避します。ラウンド ロビン パーティショニングを使用している場合、フラグメントを削除することはできません。式または間隔の断片化がある場合は、断片の除去の恩恵を受けることができます。(フラグメントの除去はパフォーマンスに大きなメリットがあるため、可能な限り実行されます。)
ただし、最終的には、適切なインデックスを配置できない場合、テーブル スキャンが必要になる可能性があり、それらはインデックス付きアクセス操作よりも遅くなる可能性があるため、クエリのパフォーマンスはおそらく遅くなります。とはいえ、テーブル スキャンがクエリを処理する最も速い方法である場合もあります。それはしばしばそうではありません。
テーブルがラウンド ロビン フラグメンテーションを使用しているかどうかを判断する方法は? ふたつのやり方:
簡単な方法の 1 つは、dbschema を使用してテーブル/インデックスのスキーマを取得することです。
UNIXprompt> dbschema -d <db name> -ss -t <table name>
テーブル作成 DDL に「ラウンド ロビン」という言葉があれば、それがわかります。
もう 1 つは、SMI を照会します。
database <db name>;
select unique(strategy) from sysfragments
where fragtype = 'T'
and tabid = (select tabid from systables where tabname = '<table name>';
次に、戦略列の値キーを示します。
R = ラウンドロビン断片化戦略
E = 式ベースの断片化戦略
I = IN DBSPACE 句は、断片化戦略の一部として特定の場所を指定します
T = テーブルベースの断片化戦略
H = テーブルはテーブル階層内のサブテーブル (IDS)、またはハッシュベースの断片化戦略 (XPS)。
最後に大事なことを言い忘れましたが、私は XLDB (これまでの最大のテーブルは幅 1.5k、600 以上の列、600 億のレコード、はい、10 億です) を使用しており、インデックス作成は秒と時間のように大きな違いをもたらします (確かに、私は持っていました) ≈100 個の vCPU を私のデータベース サーバー専用にすることをお勧めします。そのため、Change Control Council に嘆願書を作成し、インデックスを作成することをお勧めします。許可を得たら、「オンライン」句を必ず使用して、正しいインデックスを決定してください。 fillfactor を使用し、統計を更新することを忘れないでください (Art の dostat を使用してください)。
私の2セント...