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