ここまでMSSQLとAccessを使用しています。我々は、一度すべてのデータがインポートされた後、多くの更新クエリを実行する1つのアプリケーションを持っています。この特定のアプリケーションには、組み込みデータベースが必要です。 MS Accessを使用した内部ジョイントで簡単にSQLiteの更新クエリは永遠に受け取ります
私たちはSQLiteに切り替えていますが、明らかにSQLiteは非常に新しいものです。
私たちの更新クエリが正しいか、SQLiteで効率的でないようです。 彼らは永遠に(実際には決して終わらない)か働いていません。
以下の1つの例は、多対1の関係です。 "多くの"テーブルの1つのフィールドを、両方のテーブルに存在するフィールドに基づいて "One"テーブルの値に更新しようとしています。
表1(表1)
フィールド(ID) - このフィールドは、一意である
フィールド(マネージャ)
表2(多くのテーブル)
ここで
フィールド(ID) - このフィールドの値は一意ではなく、表1の(ID)フィールドの にリンクします。
フィールド(連絡先)
は、私たちのクエリです:
UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1]
WHERE [Table 2].[ID] = [Table 1].[ID])
我々はSQLiteのエキスパートプロフェッショナル以内にこれを試してみた、とクエリが実行を停止することはありません。更新される表2には53,391件のレコードしかありません。毎回SQLite Expertアプリケーションをシャットダウンする必要があります。それはちょうどハングアップします。
我々は次のようにトランザクション内で撮影し、当社のテストコードにこれを置く:
Using cmd as new SQLiteCommand(cnn)
Using transaction = cnn.BeginTransaction
cmd.Transaction = transaction
cmd.CommandText = "UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1] WHERE [Table 2].[ID] = [Table 1].[ID])"
icount = cmd.ExecuteNonQuery
transaction.Commit()
End Using
End Using
をこれが終了していないだけで決して。
これが働いた:より良い以上に高速なアプローチがあり
UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1]
WHERE [Table 2].[ID] = [Table 1].[ID])
WHERE EXISTS (Select [Manager] FROM [Table 1]
WHERE [Table 2].[ID] = [Table 1].[ID])
いないことを確認したら? WHERE EXISTSがなぜ必要なのか理解していない。
このテーブルの別のフィールドに基づいてテーブル内のフィールドを更新しようとすると、別の更新クエリの問題が発生します。再帰的な種類。
これは、やや効率的ですが、フィールドはすべてのレコードに対して同じ値で更新されています:Update [Table 2] [Contact] =(SELECT [Table 1]。 ] INNER JOIN [表2] ON [表1]。[ID] = [表2]。[ID])。 – midnite11
実際のテーブル定義と、持っているインデックスを表示します。 –
テーブル定義では正確に何を探していますか?私はこれらのテーブルの両方が[ID]フィールドにインデックスを持っていて、それぞれが最大で4つまたは5つのフィールドを持っていることを意味します。上記のクエリは「仕事」(例:フィニッシュ)になっていますが、フィールドはすべてのレコードに対して同じ値で更新されています...ちょうど我々が最後に何かを見逃しているようです。しかし、再び我々はSQLiteを初めて使用しています。 – midnite11