ExecuteReader()コマンドを使用して、いくつかのテーブルを含むデータベースを読み取っています。最初のRead()の結果に基づいて、2番目のクエリを実行するために最初のクエリで返されたIDが必要なため、2つの異なるテーブルを読み取りました。
問題は、この検索が非常に遅いことです。
tuCommand.CommandText = "SELECT * FROM tblTranslationUnit WHERE DocumentId = " + doc.DocumentId;
var tuReader = tuCommand.ExecuteReader();
while (tuReader.Read())
{
var tu = new TranslationUnit
{
TranslationUnitId = tuReader.GetInt64(0),
DocumentId = tuReader.GetInt64(1),
Raw = tuReader.GetString(2),
IsSegmented = tuReader.GetBoolean(3),
Reader = this, // Ryan: Fixed so that it sets the reader to itself
};
using (var propCommand = _dbConn.CreateCommand())
{
propCommand.CommandText = "SELECT * FROM tblTranslationUnitProperties WHERE TranslationUnitId = " + tu.TranslationUnitId;
var propReader = propCommand.ExecuteReader();
while (propReader.Read()) tu.Properties.Add(GetProperty(propReader));
}
yield return tu;
}
2番目のExecuteReader()を削除すると、クエリは非常に高速になります
また、新しい接続と新しいトランザクションを使用して2番目のExecuteReader()を配置しようとしましたが、結果はほぼ同じです。
何かアイデアや手がかりはありますか?この種の検索を行うにはどうすればよいですか?より良いアプローチはありますか?(私はそうだと思います)。
詳細db構造は次のとおりです。
- Document
- properties
- errors
-TranslationUnits
- properties
- errors
- Segments
- properties
- errors
したがって、コードの一部では、この構造になります
foreach (document in db)
foreach (property in document)
foreach (error in document)
foreach (translationunit in document)
foreach (property in translationunit)
foreach (error in translationunit)
foreach (segment in translationunit)
foreach (property in segment)
foreach (error in segment)
それに基づいて、すべてを返すために結合を使用することは、問題が単なるSQLite構成の問題であるかどうかを考えていたのは良い考えではありません。つまり、パラメータなどを追加して、複数のポインタを使用することをシステムに通知できる場合です。
現在、データテーブルソリューションに移行しています。
- 接続を開く
- テーブルの1000エントリを読み取る
- 接続を閉じます
- 新しい接続を開く
- 子テーブルの1000エントリを読み取ります
- 新しい接続を閉じます
- ..。