1

OK、私は SQLite を初めて使用しますが、次のクエリを使用して既にこれを正常に実行しています。

 UPDATE stuff
 SET UserName = (SELECT UserName FROM Temp_Stuff WHERE Temp_Stuff.EmpID = stuff.EmployeeID

これstuffは、4995 行とTemp_Stuff1814 行がある場合にうまく機能し、約 2 秒で実行されます。

このまったく同じクエリstuffを 60,000 行とTemp_Stuff55,000 行で試してみると、クエリ中にロックされ、何も処理されないようです (20 分以上待ちました)。

これを達成するためにvb.netを使用しており、ExecuteNonQueryメソッドをトランザクションにラップしており、エラーが発生した場合はトランザクションをロールバックします(この時点に到達しません)。SQLiteでこれを達成するより効率的な方法はありますか? Updateステートメントでは結合が許可されていないことに気付きました。そのため、そのアイデアは破棄されました。これは SQLite 固有の問題のようです。

*クエリ プラン: *

0   0   0   SCAN TABLE stuff(~1000000 rows)
0   0   0   EXECUTE CORRELATED SCALAR SUBQUERY 0
0   0   0   SCAN TABLE Temp_Stuff(~100000 rows)
4

1 に答える 1

1

クエリプランは、テーブル内のすべてのレコードについてTemp_Stuffテーブルが完全にスキャンされることを示しています。stuff

EmpIDルックアップがより高速に実行されるように、列にインデックスを追加します。(パフォーマンスを少し上げるには、と列の両方にカバーリングインデックスを使用しEmpIDますUserName。)

SQLiteが名前付きテーブルのインデックスを自動的に作成することはありません。それらを明示的に定義するか、UNIQUEまたはPRIMARY KEY制約を使用して暗黙的に定義する必要があります。

于 2013-03-15T18:39:46.110 に答える