Sql server ToUniversalTime()-太慢了?

Sql server ToUniversalTime()-太慢了?,sql-server,vb.net,entity-framework,sql-server-2008-r2,utc,Sql Server,Vb.net,Entity Framework,Sql Server 2008 R2,Utc,我保存了一大组数据,其中每条记录都有一个时间标记。我想用UTC时间标记保存每个项目,因此我使用ToUniversalTime()(VB.NET)转换原始时间。这种方法的使用似乎相当缓慢。你有什么建议可以加速这个过程吗 For Each i In CollectionOutput.Select(Function(f) f) Dim utcTimeMark = i.GetTIMEMARK.ToUniversalTime() contextEmanagement.pr_Collecti

我保存了一大组数据,其中每条记录都有一个时间标记。我想用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调用SQL Server存储过程。

目前,您的存储过程可能会执行类似的操作(我在这里完全是在猜测数据类型,我假设您使用的是SQL Server 2008或更高版本-请在提问时指定您的版本!):

您可以这样做:

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();
}

数据库中的每个值是否移动了相同的分钟数(例如,所有源数据都来自同一时区,并且集中的所有数据要么根本不受夏令时的影响,要么受相同数量的影响)?ToUniversalTime不“慢”。您的数据库访问占用了大部分时间。这就是我不确定是DB access还是ToUniversalTime()的原因方法。我没有测量它。从代码调用循环中的存储过程永远不会很快。只要让db处理插入或修改记录时所需的时间戳就行了。这就是为什么我问是否可以依赖所有输入值来调整到
ToUniversalTime()
立即返回。在SQL Server中,您不能执行
DATEADD(HOUR,DATEDIFF(HOUR,GETDATE(),GETUTCDATE()),@input)
?不管怎样,真正的问题是您应该能够将这些值作为一个集合来处理,而不是一次一个。您可以继续使用
ToUniversalTime()
但将值存储在(比如)一个
数据表中,并一次性将其传递给一个存储过程。顺便说一句:我使用SQL Server 2008 R2—我到目前为止发现的,我无法在存储过程中使用实体框架的表值参数。因此,我只能使用“旧”来达到目标方法-如您在此处所建议的。如果您可以传递单个字符串(例如逗号分隔的值),您可以在此处查看方法:是否有任何优雅的方法,如何在表类型中存储值-但在插入时控制重复项(不是由ID提供)?TVP是只读的,因此您可以在进入之前删除重复项,或者在查询时使用GROUP BY或DISTINCT。
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();
}