快速更新MSSQL中的列



我在Amazon RDS上使用Microsoft SQL Web服务器。该系统当前正在更新一列时生成超时,我正在尝试解决问题或至少最小化。当前,当设备打电话并打电话很多时,发生了更新,以至于设备可能会在Web服务器完成最后一个呼叫之前回电。

Microsoft SQL Server Web(64位)版本13.0.4422.0

我在这里看到了一些潜在的可能性。首先是设备在系统完成处理最后一个呼叫之前回电,以便同时多次更新相同的记录。第二种可能性是我跑到行锁或表锁中。

该表总共有大约3,000个记录。

注意,我只是尝试一次在一行中更新一列。其他列从未更新。

我不需要最后更新的时间即可变得非常准确,如果说大于几分钟,更改代码才能更新列有任何好处?关于如何优化这一点的任何建议?也许将其移至功能,存储过程或其他内容?

建议的新代码:

UPDATE [Devices] SET [LastUpdated] = GETUTCDATE()
WHERE [Id] = @id AND 
([LastUpdated] IS NULL OR DATEDIFF(MI, [LastUpdated], GETUTCDATE()) > 2);

现有更新代码:

internal static async Task UpdateDeviceTime(ApplicationDbContext db, int deviceId, DateTime dateTime)
{
    var parm1 = new System.Data.SqlClient.SqlParameter("@id", deviceId);
    var parm2 = new System.Data.SqlClient.SqlParameter("@date", dateTime);
    var sql = "UPDATE [Devices] SET [LastUpdated] = @date WHERE [Id] = @Id";
    // timeout occurs here.
    var cnt = await db.Database.ExecuteSqlCommandAsync(sql, new object[] { parm1, parm2 });
}

表创建脚本:

CREATE TABLE [dbo].[Devices](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CompanyId] [int] NOT NULL,
[Button_MAC_Address] [nvarchar](17) NOT NULL,
[Password] [nvarchar](max) NOT NULL,
[TimeOffset] [int] NOT NULL,
[CreationTime] [datetime] NULL,
[LastUpdated] [datetime] NULL,
CONSTRAINT [PK_Devices] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Devices] ADD  CONSTRAINT [DF_Devices_CompanyId]  DEFAULT ((1)) FOR [CompanyId]
GO
ALTER TABLE [dbo].[Devices] ADD  CONSTRAINT [DF_Devices_TimeOffset]  DEFAULT ((-5)) FOR [TimeOffset]
GO  
ALTER TABLE [dbo].[Devices] ADD  CONSTRAINT [DF_Devices_CreationTime]  DEFAULT (getdate()) FOR [CreationTime]
GO
ALTER TABLE [dbo].[Devices] ADD  CONSTRAINT [PK_Devices] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

您应该通过使用诸如Profiler或其他技术来检测阻塞的工具来研究原因。我不明白为什么只有3,000个记录会在更新表列时遇到问题。它可能与您的约束有关。

如果确实是一个计时问题,那么您可以在内存OLTP中考虑来处理这种类型的方案。

上次更新也可以存储在基于事务的表中,并使用MAX(更新时间)加入将链接回到该表。在这种情况下,您永远不会更新只是添加新记录。

然后,您可以使用分区或清理程序来保持此交易表的大小。

内存OLTP将改善的编程模式包括 并发方案,点查找,工作量有很多 在存储过程中插入和更新以及业务逻辑。

https://msdn.microsoft.com/library/dn133186(v = sql.120).aspx

最新更新