Oracle 11g を使用しています。タイムスタンプで範囲分割された約 10 億のレコードを含むメッセージ テーブルがあります。このメッセージ テーブルには、名前、アドレス、ID などの複数の参照パーティション サブテーブルがあります。
すべてのクエリには、メッセージのタイムスタンプ パーティション キーが含まれます。メッセージ フィールドのみでメッセージ テーブルをクエリすると、問題なく動作し、サブ テーブルから情報を取得できますが、これらの参照パーティション サブ テーブルから特定の名前、アドレス、またはその他の値を含むメッセージを検索するクエリのパフォーマンスが低下しています。
これらのクエリを分析してその計画を調べてみると、メッセージ テーブルにアクセスする前に、サブ テーブルでフル パーティション スキャンを実行していることがわかります。先頭のヒントを使用し、クエリをメッセージ テーブルから開始することで、これらのクエリのパフォーマンスを向上させることができますが、ヒントを使用する必要はなく、それでもパフォーマンスは良くありません。
現在の私の懸念は、参照パーティション モデルが私のニーズに合わない可能性があることと、別のパーティション モデルに移行する必要があることです。参照パーティショニングが参照テーブル データによるフィルタリング用に設計されていないかどうかを確認しようとしています。私は多くの Oracle ドキュメントを調べましたが、それについての言及が見つからないため、この費用のかかる移行を進めるにはまだ十分ではありません。
誰かがこれが本当かどうかをすぐに知り、どういうわけか見逃したドキュメントを指摘してくれることを望んでいました. しかし、クエリとプランの例を提供するよう求められたので、これは確かに合理的であり、省略した情報をさらに追加する必要があります。範囲パーティション化に加えて、メッセージ テーブルは varchar 列でもサブパーティション化されます。
SELECT count(*) FROM EVT_TRANS_MSG A, EVT_TRANS_MSG_ID B WHERE A.TIMESTAMP_F >= '03-OCT-13 12.00.00.000000000 AM' AND A.TIMESTAMP_F <= '03-OCT-13 11.59.59.999000000 PM' AND B.CODE = '999999999' AND A.ID = b.message_fk AND a.object_type = 'BLAH';
実行時間:529秒(8分49秒)
SELECT /*+ LEADING(A) */ count(*) FROM EVT_TRANS_MSG A, EVT_TRANS_MSG_ID B WHERE A.TIMESTAMP_F >= '03-OCT-13 12.00.00.000000000 AM' AND A.TIMESTAMP_F <= '03-OCT-13 11.59.59.999000000 PM' AND B.CODE = '999999999' AND A.ID = b.message_fk AND a.object_type = 'BLAH';
実行時間: 12 秒