0

各レコードにタイムマークが付いている大量のデータセットを保存します。各アイテムもUTCタイムマークで保存したいので、ToUniversalTime()(VB.NET)を使用して元の時刻を変換します。この方法の使用は非常に遅いようです。プロセスを加速するためのヒントはありますか?

For Each i In CollectionOutput.Select(Function(f) f)
    Dim utcTimeMark = i.GetTIMEMARK.ToUniversalTime()
    contextEmanagement.pr_Collection_Store(i.GetID, i.GetTIMEMARK, utcTimeMark, i.GetVALUE)
Next

.pr_Collection_StoreがSQLServerストアドプロシージャを呼び出す場所。

4

1 に答える 1

1

現在、ストアドプロシージャはおそらく次のようなことをしています(ここではデータ型を完全に推測しています。SQLServer2008以降を使用していると想定しています。質問するときはバージョンを指定してください!):

CREATE PROCEDURE dbo.pr_Collection_Store
  @GetID INT,
  @GetTimeMark DATETIME, 
  @UTCTimeMark DATETIME,
  @GetValue INT
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.SomeTable(ID, TimeMark, UTCTimeMark, Value)
    SELECT @GetID, @GetTimeMark, @UTCTimeMark, @GetValue;
END
GO

代わりにこれを行うことができます:

CREATE TYPE dbo.Collection AS TABLE
(
  GetID       INT,
  GetTimeMark DATETIME,
  UTCTimeMark DATETIME,
  GetValue    INT
);
GO

CREATE PROCEDURE dbo.pr_Collection_Store2
  @Collection AS dbo.Collection READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.SomeTable(ID, TimeMark, UTCTimeMark, Value)
    SELECT GetID, GetTimeMark, UTCTimeMark, GetValue
    FROM @Collection AS c
    WHERE NOT EXISTS (SELECT 1 FROM dbo.SomeTable WHERE ID = c.GetID);
END
GO

その後、アプリから。申し訳ありませんが、C#を知っています。うまくいけば、これをVB.NETに変換できます。

DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("i"));
foreach(var i in CollectionOutput)
{ 
    tvp.Rows.Add(i.GetID, i.GetTIMEMARK, i.GetTIMEMARK.ToUniversalTime(), i.GetValue); 
}

using (connection)
{
    SqlCommand cmd = new SqlCommand("dbo.pr_Collection_Store2", connection);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@Collection", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;
    connection.Open();
    cmd.ExecuteNonQuery();
}
于 2012-04-22T22:09:56.707 に答える