我有一个用.net / c#开发的Windows服务。
它经常使用存储在 SQL Server 中的位置数据更新表。更新 SQL 查询非常慢,大约在 0.5-1.5 秒之间。该表中的记录不超过 1500 条。
您能帮我找到我想念的东西吗?这次更新应该有 sg,我有其他的可以完美快速地工作。
非常感谢!
表:
CREATE TABLE [LastPosition] (
[lastposition_id] INTEGER IDENTITY NOT NULL,
[unit_id] INTEGER NOT NULL,
[date_time] DATETIME NOT NULL,
[valid] TINYINT NOT NULL,
[lat] REAL NOT NULL,
[lon] REAL NOT NULL,
[angle] SMALLINT NOT NULL,
[speed] SMALLINT NOT NULL,
[digit] TINYINT NOT NULL,
[altitude] SMALLINT NULL,
[sat] TINYINT NULL,
[extrainfo] NVARCHAR(255) NOT NULL,
[geoinfo] TINYINT NULL,
CONSTRAINT LastPositionPrimaryKey PRIMARY KEY NONCLUSTERED(lastposition_id));
查询:
exec sp_executesql N'UPDATE [LastPosition]
SET [LastPosition].[Unit_id]=@up_Unit_id,
[LastPosition].[Date_Time]=@up_Date_Time,
[LastPosition].[Valid]=@up_Valid,
[LastPosition].[Lat]=@up_Lat,
[LastPosition].[Lon]=@up_Lon,
[LastPosition].[Angle]=@up_Angle,
[LastPosition].[Speed]=@up_Speed,
[LastPosition].[Digit]=@up_Digit,
[LastPosition].[Altitude]=@up_Altitude,
[LastPosition].[Sat]=@up_Sat,
[LastPosition].[ExtraInfo]=@up_ExtraInfo,
[LastPosition].[GeoInfo]=@up_GeoInfo
WHERE [LastPosition].[LastPosition_id] = @0',N'@up_Unit_id int,@up_Date_Time datetime,@up_Valid int,@up_Lat float,@up_Lon float,@up_Angle int,@up_Speed int,@up_Digit int,@up_Altitude int,@up_Sat int,@up_ExtraInfo nvarchar(13),@up_GeoInfo int,@0 int',@up_Unit_id=1164,@up_Date_Time='2022-09-19 10:21:33.457',@up_Valid=1,@up_Lat=49,612609999999997,@up_Lon=15,922759999999999,@up_Angle=127,@up_Speed=0,@up_Digit=255,@up_Altitude=138,@up_Sat=19,@up_ExtraInfo=N'Kkt löueléket',@up_GeoInfo=27,@0=1111
更新: 此表上没有任何视图。没有任何触发器。我没有连接问题。
考虑到没有视图、触发器或连接问题,有几个潜在的原因
1.在 LastPosition_id 列上添加索引,您要在 WHERE 中过滤此列,索引应显着提高性能(以防万一)
2.避免更新一个查询中的所有列,将其分成多个查询,更新更少的列,这可以减少锁定/阻塞
2.如果经常需要更新多行,请考虑使用批量更新而不是逐行更新,这可以最大限度地减少日志记录开销,这是一个例子
CREATE TABLE #LastPositionUpdates
(
LastPosition_id INT,
Unit_id INT,
Date_Time DATETIME,
Valid BIT,
Lat FLOAT,
Lon FLOAT,
-- other columns to update
)
-- Insert updates into staging table in c#
INSERT INTO #LastPositionUpdates
VALUES
(1111, 1164, '2022-09-19 10:21:33.457', 1, 49.612609999999997, 15.922759999999999),
(2222, 1165, '2022-09-19 10:22:11.123', 0, 49.61265, 15.92280),
-- insert other rows to update
-- Join staging table to target and update
UPDATE lp
SET
lp.Unit_id = lu.Unit_id,
lp.Date_Time = lu.Date_Time,
lp.Valid = lu.Valid,
lp.Lat = lu.Lat,
lp.Lon = lu.Lon
-- set other columns
FROM LastPosition lp
JOIN #LastPositionUpdates lu
ON lp.LastPosition_id = lu.LastPosition_id
-- Drop temporary table
DROP TABLE #LastPositionUpdates