如何调整 SQL 更新以提高性能?

问题描述 投票:0回答:1

我有一个用.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

更新: 此表上没有任何视图。没有任何触发器。我没有连接问题。

查询计划:

sql sql-server t-sql query-optimization
1个回答
0
投票

考虑到没有视图、触发器或连接问题,有几个潜在的原因

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
  1. 确保您的数据库统计信息是最新的,以便查询优化器可以创建最佳查询计划。在表上运行 UPDATE STATISTICS,然后使用 SQL Server Profiler 检查是否存在阻塞或死锁
© www.soinside.com 2019 - 2024. All rights reserved.