• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:該当データが存在しないときに、全件検索を回避するには?)

該当データが存在しないときに、全件検索を回避するには?

このQ&Aのポイント
  • Oracle 10gで特定のデータが存在しない場合に、全件検索を回避する方法を知りたいです。
  • データベーステーブルにおいて、インデックスを使わないで特定のデータの存在を確認する方法を教えてください。
  • データベーステーブルのインデックスがない状態で、特定のデータの存在を効率的に確認する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • joih
  • ベストアンサー率35% (37/105)
回答No.1

うーん、混乱する質問ですね。整理すると、 (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)になっていませんか?

kurinkurinkurin
質問者

補足

コメントありがとうございます。 はい、質問の意図はご指摘の通りです。 A01KINGAKU, A02KINGAKU , A03KINGAKUすべてが全件検索されています。 実行計画は確認しております。 パーティションテーブルは、Enterprise以上でないと使えないので このようなテーブル構成を自作しているようです。

その他の回答 (1)

  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.2

こんにちは。 インデックスが意図した形で機能してくれない、 ということなんですが、オラクルでインデックスが機能しない ケースというのはご存知でしょうか? オラクルでは全レコード数の確か5%程度の結果が得られる場合に、 インデックス検索を行うというそうです。 つまり、極端な話ですと、1万件の中から9999件のレコードを 取得するのに、いちいちインデックスを使うよりも、 テーブルを総なめしたほうが高速である、ということです。 オラクルはこれを自動的に判断しています。 提示された例で考えると、テーブル内には1万社分のレコードが 登録されていて、テーブルに存在しないキーを条件につけた場合、 ということでの相談なっていますが、ただ単にレコードの有無だけを 判断するのでしたら、COUNT(キー項目)をとるのが良いと思います。 「*」を使うと、カーソルを使用したり、不要なフィールドへの アクセスが発生し、パフォーマンス的にも悪影響を及ぼします。 ですので、キー項目のカウントを取ることによって、 全体のパフォーマンスは向上すると思いますよ。 #1さんへの回答にありますように、索引の全体検索となっている だけですと、それが現状の最高パフォーマンスといえますが、 全表検索が走っているようであれば、そのテーブルの設計に問題が あるようにも感じられます。 現状1万件程度のデータで、どれくらいのパフォーマンスを発揮して いるのでしょうか? 私も色々とチューニングを経験してきましたけど、最もボトルネックが 潜んでいるといえるのが、実は実行する SQL 文だったりします。 あと最後にアドバイスですが、ビューは SQL 文を見やすくはしますが、 落とし穴になりがちです。 実際、SQL を実行した際には最初に実行されるのがビューの部分です。 ここで巨大な2つのテーブルを JOIN しているようなら、 そこがボトルネックになります。 2つのテーブルを、その段階で全表検索します。