- ベストアンサー
該当データが存在しないときに、全件検索を回避するには?
- Oracle 10gで特定のデータが存在しない場合に、全件検索を回避する方法を知りたいです。
- データベーステーブルにおいて、インデックスを使わないで特定のデータの存在を確認する方法を教えてください。
- データベーステーブルのインデックスがない状態で、特定のデータの存在を効率的に確認する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
うーん、混乱する質問ですね。整理すると、 (1)ALLKINGAKUビューが下記のとおり作成してある。 Select * from A01KINGAKU union all Select * from A02KINGAKU union all Select * from A03KINGAKU (2)A01KINGAKU、A02KINGAKU、A03KINGAKUテーブルにはそれぞれ KAISHA項目があり、インデクスが貼ってある。 (3)このビューに対して Select * from ALLKINGAKU where KAISHA = 'A2' と検索したら A01KINGAKUテーブルを全件検索していた気がする。 A01KINGAKUテーブルを全件検索してないと思うには、 または該当するテーブルだけを検索するようにするにはどうしたらいいですか? という質問ですか? パーティションテーブルを使ったらどうでしょうか。 SQL実行計画は見ましたか? 全件検索(TABLE ACCESS FULL)ではなく索引検索(INDEX RANGE SCAN)になっていませんか?
その他の回答 (1)
- SUPER-NEO
- ベストアンサー率38% (706/1857)
こんにちは。 インデックスが意図した形で機能してくれない、 ということなんですが、オラクルでインデックスが機能しない ケースというのはご存知でしょうか? オラクルでは全レコード数の確か5%程度の結果が得られる場合に、 インデックス検索を行うというそうです。 つまり、極端な話ですと、1万件の中から9999件のレコードを 取得するのに、いちいちインデックスを使うよりも、 テーブルを総なめしたほうが高速である、ということです。 オラクルはこれを自動的に判断しています。 提示された例で考えると、テーブル内には1万社分のレコードが 登録されていて、テーブルに存在しないキーを条件につけた場合、 ということでの相談なっていますが、ただ単にレコードの有無だけを 判断するのでしたら、COUNT(キー項目)をとるのが良いと思います。 「*」を使うと、カーソルを使用したり、不要なフィールドへの アクセスが発生し、パフォーマンス的にも悪影響を及ぼします。 ですので、キー項目のカウントを取ることによって、 全体のパフォーマンスは向上すると思いますよ。 #1さんへの回答にありますように、索引の全体検索となっている だけですと、それが現状の最高パフォーマンスといえますが、 全表検索が走っているようであれば、そのテーブルの設計に問題が あるようにも感じられます。 現状1万件程度のデータで、どれくらいのパフォーマンスを発揮して いるのでしょうか? 私も色々とチューニングを経験してきましたけど、最もボトルネックが 潜んでいるといえるのが、実は実行する SQL 文だったりします。 あと最後にアドバイスですが、ビューは SQL 文を見やすくはしますが、 落とし穴になりがちです。 実際、SQL を実行した際には最初に実行されるのがビューの部分です。 ここで巨大な2つのテーブルを JOIN しているようなら、 そこがボトルネックになります。 2つのテーブルを、その段階で全表検索します。
補足
コメントありがとうございます。 はい、質問の意図はご指摘の通りです。 A01KINGAKU, A02KINGAKU , A03KINGAKUすべてが全件検索されています。 実行計画は確認しております。 パーティションテーブルは、Enterprise以上でないと使えないので このようなテーブル構成を自作しているようです。