簡體   English   中英

快速更新MSSQL中的列

[英]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將改進的編程模式包括並發方案,點查找,包含許多插入和更新的工作負載以及存儲過程中的業務邏輯。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM