DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SQLite JOINとWHEREの違い

環境/言語:[SQLite WindowsXP VS C#]
分類:[.NET]

Table_AとTable_Bというテーブルがあるとして、
どちらにもidというカラム?が存在しています。
そこで、Table_AのidとTable_Bのidが同じTable_Aのデータを
SELECT文で取得するSQL文を考えていたのですが、
@とAの違いはあるのでしょうか?

@SELECT * FROM Table_A WHERE Table_A.id = Table_B.id

ASELECT * FROM Table_A JOIN Table_B ON Table_A.id = Table_B.id

よろしくお願いします。
■No30036に返信(陽菜さんの記事)

SQLiteの場合にどうなのか分かりませんが、
Joinで結合した場合、インデックス項目ならインデックスが使用される
可能性が高いですがWhere句だと全件からの条件絞込みになる可能性が
高いです。
■No30037に返信(shuさんの記事)
返信ありがとうございます。
> Joinで結合した場合、インデックス項目ならインデックスが使用される
> 可能性が高いですがWhere句だと全件からの条件絞込みになる可能性が
> 高いです。
ということは、Where句の方が絞り込みに時間がかかるということでしょうか?
■No30038に返信(陽菜さんの記事)

あくまで可能性の話です。Whereの方が速い可能性もあります。
結果は同じなので試してみるのが一番良いと思います。
■No30039に返信(shuさんの記事)
返信ありがとうございます。
> あくまで可能性の話です。Whereの方が速い可能性もあります。
> 結果は同じなので試してみるのが一番良いと思います。
両方試してみます!

それほど、違いはないということなのですね。
個人的には見易さなどの違いかなと思いました。
ありがとうございました。
解決済み!
SQLLite ではどうなのか分かりませんが、
他の(SQLサーバーとかオラクルとか)DBでは、FROM句の処理をしてからWhere句の処理をします。
結果は同じに見えますが、途中が違います。
Joinを使わない場合、テーブルの直積を内部に作って、そこからWhere句の条件で抽出します。
Joinがあると、内部のテーブルの作成時点で抽出されています。
例えばTable_Aが10件、Table_Bが100万件あるとき、1000万件のレコードを持つ内部テーブルが作成されて、そこから条件に合う10件を引っ張ってくるか、10件の内部テーブルが作成されて10件を引っ張ってくるか、というような違いが出てきます。
すると、実行時間に大きな影響を与えます。

実際のSQLでどういう処理になっているか、を調べるのが実行計画です。
パフォーマンスを良くしたいなら、実行計画を調べましょう。


■No30040に返信(陽菜さんの記事)
> ■No30039に返信(shuさんの記事)
> 返信ありがとうございます。
>>あくまで可能性の話です。Whereの方が速い可能性もあります。
>>結果は同じなので試してみるのが一番良いと思います。
> 両方試してみます!
>
> それほど、違いはないということなのですね。
> 個人的には見易さなどの違いかなと思いました。
> ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板