以下のようなSQLについて教えてください。こんにちはゲストさん。以下のようなSQLについて教えてください。売上トランと商品マスタがあるとします。商品マスタは全件で100万件あり、そのうち95万件は既に廃止になっているとします。下だと削って5万件だけになったものをっつけていて、下の書き方の方が良いのかな?と思ったものの、どこかの本などでこういう書き方が良いと読んだわけではないので、イメージであっているのか、それとも変わらないのか質問しました。削除フラグのように1か0の2値しかとらない項目については、INDEXを張る効果はあるでしょうか?ちなみにverで挙動が変わるかわかりませんが、環境はoracle11gを想定した場合となります。検索は下の方が速くなったりしますか?統計情報が正しく取られているなら速くはならないでしょう(同じということ)。'0'で絞ってから結合という実行計画になると思われます。上の記述の方がシンプルなのでおすすめします。複雑な記述はオプティマイザを惑わせたり、オラクルの不具合を引く確率を高めたりするので。※絞り込んだ後も商品マスタの件数が5万件と大きめなので、例え売上トラン.商品コード列に索引があったとしても、ハッシュ結合が選択される可能性があります。INDEXを張る効果はあるでしょうか?例え2値しかなくても、1/20に絞り込まれるわけですから大いにあります。バインド変数を使用していないならなおさらです。用される列だけヒストグラム統計を取ってくれるようになっていますが、自動的に取ってくれない場合は手動で取る必要があります。(0)通報するANo.3pringlezもしかしたら同じアクセスパスになるかもしれません。・2つめだったら商品マスタを絞ってから結合になると思います。確かなことは実行しなければ分かりません。同じSQLでもレコード数によってもアクセスパスは変わります。同じSQL・同じレコード数でも、実行時間が長いときにはより最適な方法を探そうとしてアクセスパスが変わることもあります。導入当初と運用中にアクセスパスが変わるのはよく発生することなので、「導入したときはこうだったんだけど...」といわずに毎週もしくは毎月のようにチェックをしたほうがいいです。想像して終わりなのではなく、STATSPACKをとるなどして実際のアクセスパスを確認するようにしましょう。'0'とすればいいのに、なぜ結合してから絞るの?と思ってしまいます。>また、削除フラグのように1か0の2値しかとらない項目については、>INDEXを張る効果はあるでしょうか?この検索の仕方でかつ、100万件のデータでかつ、取得するのが5万件なら確実に効果はあります。確実に先に絞り込むためにあなたの2つ目のSQLか、私の書いたSQLにしてみましょう。これこそ実測して確かめたほうがいいですよ。どのくらい効果があるのか理解できるでしょうから。あと、お勧めでいうと、廃止したデータがそんなに多いのなら、廃止データは別テーブルに移動したほうがいいですよ。通常は有効な商品を使った検索が多いのでしょうから。すればインデックスを使うよりはるかに速く検索できます。廃止もふくめて検索する場合には2つのテーブルをUNIONするのはどうでしょう。(0)通報するANo.2noname#212058統計情報がきちんと取られているのなら、おそらくどちらも変わらないと思います。上のSQLの場合『全件同士でくっつけた後で削る』動きになるとは限りません。自動的にどっちが効率的かを判断して決めます。件数が明らかに少ないので、おそらく『削る』ほうが先に動くかと思います。機能を『オプティマイザ』といい、オプティマイザが決めた処理順序を『実行計画』と言います。どちらもDBのパフォーマンスを語る場合には避けて通れません。効率の良さは実行計画を比べると判ります。実行できるのであれば、以下のページを参考に実行計画を取得してみましょう。項目から効率を見ることができます。(0)通報するANo.1bin-chanやってみないと、ではあるがフラグ判定してJOINの方がよさそう。テーブルが複数(この場合2つ)ある場合。どなたか以下の構文について教えて下さい。joinについてお教え下さい。