0

私の SQLite データベースには、ほぼ 200 万件のレコードを含む 1 つのテーブルがあり、いくつかのレコードの誕生日は null です。この更新で参照できる両方の ID が同じであるため、別のデータベースからのデータで修正したいと考えています。

しかし、私は読書に問題があり、それを更新するための別のものがあると信じています。

読み取りの問題です。1 つずつ読み取ることなく、結果からすべての ID を取得する方法はありますか?

実行中のクエリは次のとおりです (誕生日はインデックス化されています):

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

現在、すべての ID を取得するためにこれを行っています (最初の 300k レコードで 3 分程度かかり、その後 250k レコードで 9 分程度に増加し、遅延が増加し続けます)。

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

ids リストを再利用して正しい誕生日の各レコードの更新を実行すると、同じ問題が発生すると想定されます。それが第二の課題になると思います。

すべてのレコードを必要なデータですばやく更新する方法はありますか?

注: SQLITE を更新するために読み取る誕生日は、リモートの MySQL サーバーから取得されるため、update select などの 2 in 1 クエリをリンクすることはできません。

表の形式は次のとおりです。

id
first_name
last_name
birthday
email
status

SQLite Admin で同じクエリを実行すると、すべてのデータを吐き出すのに 2371 ミリ秒かかるので、間違って読んでいるか、1 つずつ読んでいると本当にひどく傷ついているに違いないと思います。

4

4 に答える 4

2

データベースでこの SQL を実行します。すべてのレコードを反復処理する必要はありません。必要なすべてを 1 回のアクションで実行します。

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.FillDataTable、または内のすべてのデータを読み取ることができDataSetます。

これがより高速になるかどうかはわかりませんが、おそらく試してみる価値があります。

DbCommandというインスタンスがあると仮定するとcmd、コードは次のようになります。

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

(SqliteDataAdapterを使用する必要があると思います-SQLiteでどのように呼び出されるか正確にはわかりません)

この後、table1 つの列があり、必要なすべてのデータが含まれている必要があります。

これがまだ遅い場合は、私が試す他のこと:

  • バッチでデータを処理する (たとえば、PK ID に基づいて、一度に 100 または 1000 アイテム)
  • 可能であれば、C# に頼らずに実行してみてください (たとえば、MySQL でデータのインポートを行い、そこで を実行しUPDATEJOINから、データを SQLite に戻します)。
于 2012-10-18T14:41:55.143 に答える
0

GROUP_CONCATを使用して ID のリストをカンマ区切りの文字列として取得し、それを int の配列に分割できます。何かのようなもの:

SELECT GROUP_CONCAT(id) FROM personal WHERE birthday IS NULL OR birthday = ''

次に、コードで次のようにします。

var ids = myStringOfIDs.Split(',').Select(val => int.Parse(val));

更新の場合、1 つの方法はバッチ更新を行うことです。

于 2012-10-18T16:23:09.577 に答える
0

1 回の呼び出しで、データセット内のすべての行を取得できます。

     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 に答える