我的SQLite数据库中有一个表有近200万条记录的表,有些记录的生日为空,我想修复antoher数据库中的数据,因为两者上的ID都相同,我可以参考此更新。< / p>
但是我有一个阅读问题,我相信我会更新它。
阅读问题,是否有办法从结果中获取所有ID而无需逐一阅读?
正在执行的查询是(生日被编入索引):
SELECT id FROM personal WHERE birthday IS NULL OR birthday = ''
目前我这样做是为了检索所有ID(对于前300k记录需要3分钟,然后对于250k记录增加到9分钟并继续增加延迟):
while (reader.Read())
{
ids.Add(reader.GetInt32(0));
}
我将重复使用id列表来执行对每个记录的更新以及正确的生日,我假设我将遇到同样的问题,通过逐个插入1来完成它需要很长时间才能完成我们认为这将是第二个问题。
是否有快速方法可以使用所需数据更新所有记录?
注意:我将阅读更新SQLITE的生日将来自远程MySQL服务器,因此我无法链接二合一查询,如更新选择等。
表格格式为:
id
first_name
last_name
birthday
email
status
当我在SQLite Admin上运行相同的查询时,需要2371ms才能吐出所有数据,所以我认为我必须读错了或者1读1必须伤害它真的很糟糕。 < / p>
答案 0 :(得分:2)
在您的数据库上执行此SQL。无需遍历所有记录。它可以在一个动作中完成所有操作:
UPDATE
Persons
SET
Persons.birthday = OtherTable.birthday
FROM
Persons
INNER JOIN
OtherTable
ON
Persons.ID = OtherTable.ID
WHERE
Persons.birthday IS NULL OR Persons.birthday = ''
答案 1 :(得分:1)
您可以尝试使用the DataAdapter.Fill
method阅读DataTable
或DataSet
中的所有数据。
我不确定这是否会更快,但它可能值得尝试。
假设您有一个名为DbCommand
的{{1}}实例,代码可以是:
cmd
(我认为你必须使用SqliteDataAdapter - 我不确切知道它是如何调用SQLite的)
在此之后,var table = new DataTable();
var adapter = new SqlDataAdapter(cmd);
adapter.Fill(table);
应该有一列并包含您需要的所有数据。
我会尝试的其他事情,如果这仍然很慢:
table
运行UPDATE
,然后将数据带回SQLite)答案 2 :(得分:0)
您可以在一次调用中检索数据集中的所有行。
using (SqlConnection cnn = new SqlConnection("connection_string_here"))
{
SqlDataAdapter da = new SqlDataAdapter("SELECT id FROM personal
WHERE birthday IS NULL OR birthday = ''", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "personal");
List<string> pids = new List<string>();
foreach(DataRow row in ds.Tables["personal"].Rows)
{
pids.Add(row["id"].ToString());
// similarly you can update row objects here.
}
}
在数据集中执行更新,然后使用dataset对象保存更改。
http://support.microsoft.com/kb/301248
http://www.datadirect.com/resources/ado-net/sqlserver-code-examples/updating-dataset.html
答案 3 :(得分:0)
您可以使用GROUP_CONCAT以逗号分隔的字符串检索ID列表,然后将其拆分为整数数组。类似的东西:
SELECT GROUP_CONCAT(id) FROM personal WHERE birthday IS NULL OR birthday = ''
然后在你的代码中执行:
var ids = myStringOfIDs.Split(',').Select(val => int.Parse(val));
要进行更新,一种方法是batch updates。