我正在使用 ExecuteReader() 命令读取包含一些表的数据库。根据我在两个不同表中读取的第一个 Read() 结果的结果,因为我需要在第一个查询中返回的 ID 来运行第二个查询。
问题是这个搜索非常慢。
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;
}
如果我删除第二个 ExecuteReader() 查询真的很快
我还尝试使用新连接和新事务放置第二个 ExecuteReader() 但结果几乎相同
任何想法或线索?我该如何进行这种搜索?有没有更好的方法?(我想是的)。
更多细节数据库结构是:
- 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 个条目
- 关闭新连接
- ...