在SQLite-DB中是一个有两行的表(ID,Start)。当表按Start-column排序时,ID必须具有连续编号。
当前内容示例:
ID {0,44,88,132 ...}开始{0,44,88,132 ...}
我需要的结果:
ID {1,2,3,4 ...}和开始{0,44,88,132 ...}
此代码用于更正ID列,但对于较大的表,它需要很长时间:
using (var transaction = conn.BeginTransaction())
{
using (var cmdRows = new SQLiteCommand(
"SELECT Start FROM Tokens ORDER BY Start ASC;", conn))
{
using (SQLiteDataReader reader = cmdRows.ExecuteReader())
{
int id = 0;
while (reader.Read())
{
id += 1;
var cmdID = new SQLiteCommand(conn);
cmdID.CommandText =
"UPDATE Tokens SET ID=" + id.ToString() +
" WHERE Start=" + reader["Start"].ToString();
cmdID.ExecuteNonQuery();
}
}
}
transaction.Commit();
}
生成3个表并直接执行的代码,内容为3个循环(1个嵌套,另一个嵌套在嵌套中)。外循环为Parallel.ForEach,速度提高2倍。但是除了上面的代码之外,它还运行在大表的速度问题上。使用Parallel.ForEach,我无法在连续编号中获得ID列按时间顺序排列。对于串行循环,我不需要上面的代码,结果很好,但对于大型表来说速度较慢。
目前,我唯一可接受的解决方案是放弃Parallel.ForEach并返回正常的ForEach。
想要解决的问题概述如下: -
ID不是rowid。
我有一个分析文本的标记器,我需要一个变量来识别文本中的每个标记/单词及其订单号。
这样可以找到一个文本结构,例如显示所有文本部分,其中辅助动词后跟动词的连续形式:e,g: -
在我们现在游泳(发现“游泳”)将是SELECT .... WHERE t1.Attr='aux' and t2.Attr='converb' and t1.id=t2.id-1
可以使用单个SQL语句分配连续的ID:
UPDATE Tokens
SET ID = (SELECT count(*)
FROM Tokens AS T2
WHERE T2.Start <= Tokens.Start);
但是,为每个条目执行单个UPDATE可能会更快,因为数据库不必对每一行进行计数。
在任何情况下,两种算法都需要Start
列上的索引才能有效。