- ベストアンサー
結合の種類と速度について
みなさんこんばんは、 「結合」について教えてください。 Q1.inner join と left join では、どちらが早いでしょうか?どちらのテーブルにも対応するレコードは全て存在しているという前提です。 Q2.結合フィールドのタイプとして long もしくは text(size = 8)では前者の方が早いと思うのですがいかがでしょうか? よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
DBMSには何を使用していますか? 使用しているDBMSによって、内部での処理が異なっている可能性もあります。 一番よいのは、それぞれのDBMSで実際のパフォーマンスを計測してみることです。 OracleやDB2などであれば、実行計画やアクセスプラン(DBMSで呼び方が異なります)を参考にするとよいでしょう。 また、インデックスの張り方によっては、速度も劇的に違ってきますので、参考までに。
その他の回答 (1)
- AS400
- ベストアンサー率69% (9/13)
Q1について: neuron-xさんも書いてあるように、RDBMSの機種に依存しますし、表の定義にも大きく依存する話で一般的な解は無いと思います。また、SQLの書き方が異なっても結果的に同じ情報を処理すると判断できる場合は、RDBMSのオプティマイザの最適化処理によって両方のSQLが同じ処理(同じアクセスパスでの処理)に最適化され、同じ速度で動く、、という事も多いにありうるでしょうね。 Q2について: 多くのRDBMSの実装では文字列の比較より整数の比較の方が高速ですので、longで定義したほうが速く処理できる場合が多いと思います。しかし、これもこれもQ1と同じく測ってみないと正確な事はわかりません。また、その列にINDEXが作成してある場合、差はほとんど出ないかもしれません。(INDEXはB-TREE形式、もしくは類似の形式で格納される実装がほとんどですので)
お礼
ありがとうございました。 ずいぶんお礼が遅くなり、 申し訳ございませんでした。 いただいたコメントにありますように、 INDEX を設定すると、レコードの更新を除けば、 実質 long と変わらないようにも 思えます。(内部の詳細を知らないので 推測の域をでませんが) まず、long を考え、その後総合的に判断し、 文字列も検討するようにしたいと思います。
補足
アドバイスいただき ありがとうございます。 「実測」も検討したのですが、「理論的」に判断できるのではと思い質問させていただきました。特に、結合フィールドのタイプについては、いわゆるセオリー的なものがあるのでは、と考えていました。 そこで再度の質問で恐縮ですが、 結合フィールドのタイプとして、整数である LONG と文字列である STRING とでは、LONG に軍配があがる、と考えています。これは、 if( i == j ) と if( strcmp(p0, p1) == 0 ) 等の速度の違いからの推測です。 レコード総数が LONG で対応できる程度であれば、LONG を使うべきか、と思っていますが、実際のところどうなんでしょうか? よろしければ回答いただければ、と思います。