[英]Updating column in MSSQL quickly
我在Amazon RDS上使用Microsoft SQL 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
您應該使用探查器之類的工具或其他技術來檢查原因,以檢測阻塞。 我不明白為什么只用3,000條記錄更新表的一列會有問題。 它可能與您的約束有關。
如果確實是時間問題,那么您可以考慮在內存OLTP中使用它來處理這種情況。
上次更新還可以存儲在基於事務的表中,並使用Max(UpdatedTime)通過聯接返回該表的鏈接。 在這種情況下,您永遠不會僅添加新記錄就進行更新。
然后,您可以使用分區或清理例程來減小此事務表的大小。
內存中OLTP將改進的編程模式包括並發方案,點查找,包含許多插入和更新的工作負載以及存儲過程中的業務邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.