次に、2つのsqliteクエリを示します。
SELECT * FROM items JOIN licenses ON items.id=licenses.id OR items.type=licenses.type;
このクエリは使用しませんOR
、使用しますUNION
SELECT * FROM items JOIN licenses ON items.id=licenses.id UNION SELECT * FROM items JOIN licenses ON items.type=licenses.type;
idのlicensesテーブルにインデックスがあり、typeのlicensesテーブルにインデックスがあるとすると、を使用する最初のクエリはOR
ほんの少し遅くなりませんか?
最初のクエリがSqliteの2番目のクエリよりも約20倍遅いことがわかりましたが、その原因は何ですか?
最初のクエリでは、内部計画は次のようになると思います。
- 表の各行について
items
: id
テーブルの列から値を取得し、それを使用してテーブルitems
内のすべての行を検索し、一致する行のセットAを呼び出します。licenses
id
type
テーブルの列から値を取得し、それを使用してテーブルitems
内のすべての行を検索し、一致する行のセットA'を呼び出します。AとA'を組み合わせて、重複する行を削除します。結果行のリストに結果を追加しますlicenses
type