2

次に、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を呼び出します。licensesid
  • typeテーブルの列から値を取得し、それを使用してテーブルitems内のすべての行を検索し、一致する行のセットA'を呼び出します。AとA'を組み合わせて、重複する行を削除します。結果行のリストに結果を追加しますlicensestype
4

1 に答える 1

0

結合を行うために、SQLiteは2つのテーブル(インデックスで最適化できます)でネストされたループ結合のみをサポートします。SQLiteクエリプランナークエリプランニングで説明されているように、一度に2つのテーブルで結合を行うことは、サポートされている最適化の1つではありません。

于 2012-10-20T07:50:20.710 に答える