检索所有id而不迭代?

时间:2012-10-18 14:33:58

标签: c# sqlite .net-4.0

我的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>

4 个答案:

答案 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阅读DataTableDataSet中的所有数据。

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

假设您有一个名为DbCommand的{​​{1}}实例,代码可以是:

cmd

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

在此之后,var table = new DataTable(); var adapter = new SqlDataAdapter(cmd); adapter.Fill(table); 应该有一列并包含您需要的所有数据。

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

  • 批量处理数据(例如,基于PK id一次100或1000个项目)
  • 如果可能的话,
  • 尝试不使用C#(例如,在MySQL中进行数据导入,在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