0

我的 SQLite 数据库中有一张包含近 200 万条记录的表,其中一些记录的生日为空,我想使用另一个数据库中的数据进行修复,因为两者的 id 相同,我可以在此更新中引用它。

但是我有一个阅读问题,我相信我会有另一个更新它。

阅读问题,有没有办法从结果中获取所有 id 而不必 1 by 1 读取?

正在执行的查询是(生日被索引):

SELECT id FROM personal WHERE birthday IS NULL OR birthday = ''

目前我这样做是为了检索所有 id(前 300k 条记录需要大约 3 分钟,然后对于 250k 记录增加到大约 9 分钟,并不断增加延迟):

while (reader.Read())
{
    ids.Add(reader.GetInt32(0));
}

在我将重用 ids 列表以使用正确的生日对每条记录执行更新之后,我假设我会遇到同样的问题,通过插入 1 x 1 来完成它需要很长时间,这将我们带到什么我相信这将是第二个问题。

有没有一种快速的方法可以用所需的数据更新所有记录?

注意:我将读取更新 SQLITE 的生日将来自远程 MySQL 服务器,因此我无法链接 2 合 1 查询,如更新选择等。

表格格式为:

id
first_name
last_name
birthday
email
status

当我在 SQLite Admin 上运行相同的查询时,需要 2371 毫秒才能吐出所有数据,所以我认为我一定是读错了,或者一读一读一定会伤害它真的很糟糕。

4

4 回答 4

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 = ''
于 2012-10-18T14:42:34.147 回答
1

您可以尝试使用DataAdapter.Fill方法读取 aDataTable或 a中的所有数据DataSet

我不确定这是否会更快,但这可能值得一试。

假设您有一个DbCommand名为 的实例cmd,代码可能是:

var table = new DataTable();
var adapter = new SqlDataAdapter(cmd);
adapter.Fill(table);

(我认为你必须使用 SqliteDataAdapter - 我不知道它是如何调用 SQLite 的)

在此之后,table应该有一列并包含您需要的所有数据。

如果这仍然很慢,我会尝试其他事情:

  • 批量处理数据(例如一次 100 或 1000 个项目,基于 PK id)
  • 如果可能,尝试在不使用 C# 的情况下执行此操作(例如,在 MySQL 中进行数据导入,在那里运行UPDATEwithJOIN然后将数据带回 SQLite)
于 2012-10-18T14:41:55.143 回答
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.
         }
        }

在数据集中执行更新,然后使用数据集对象保存更改。

http://support.microsoft.com/kb/301248

http://www.datadirect.com/resources/ado-net/sqlserver-code-examples/updating-dataset.html

于 2012-10-18T14:47:54.523 回答
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));

对于更新,一种方法是进行批量更新

于 2012-10-18T16:23:09.577 回答