日期:2014-05-17  浏览次数:20702 次

运行时间200ms以内的sql还有优化空间吗
最简单的一个insert into语句:
写入登录历史表,

exec sp_executesql N'INSERT INTO [LoginHistory]([UserID],[LoginTime],[LogoutTime],[DeviceType]) VALUES (@UserID,@LoginTime,@LogoutTime,@DeviceType);select @@IDENTITY',N'@UserID int,@LoginTime datetime,@LogoutTime datetime,@DeviceType int',@UserID=2,@LoginTime='2012-07-27 16:25:49.270',@LogoutTime=NULL,@DeviceType=1

在并发量300的时候最长执行时间需要120ms,该表只有一个唯一主键ID, identity1,1)和一个外键。

且该表中数据量目前不超过2w,请问大家一下,还有优化的空间吗?

------解决方案--------------------
不要动态执行,用存储过程直接insert,
------解决方案--------------------
貌似没有什么可优化空间了。

create table [LoginHistory]
(
Id int identity(1,1) primary key,
UserID int,
LoginTime datetime,
LogoutTime datetime,
DeviceType int
)
go
create proc Add_LoginHistory
(
@UserID int,
@LoginTime datetime,
@LogoutTime datetime,
@DeviceType int
)
as
begin
insert into [LoginHistory]
([UserID],[LoginTime],[LogoutTime],[DeviceType]) 
values (@UserID,@LoginTime,@LogoutTime,@DeviceType);
select @@IDENTITY
end
go

sp_executesql 
N'INSERT INTO [LoginHistory]
([UserID],[LoginTime],[LogoutTime],[DeviceType]) 
VALUES (@UserID,@LoginTime,@LogoutTime,@DeviceType);select @@IDENTITY',
N'@UserID int,@LoginTime datetime,@LogoutTime datetime,@DeviceType int',
@UserID=2,
@LoginTime='2012-07-27 16:25:49.270',
@LogoutTime=NULL,
@DeviceType=1

exec Add_LoginHistory 2,'2012-07-27 16:25:49.270',null,1


To 涩郎:
我本地测试存储过程的开销很大呀....
------解决方案--------------------

sp_executesql 
N'INSERT INTO [LoginHistory]
([UserID],[LoginTime],[LogoutTime],[DeviceType]) 
VALUES (@UserID,@LoginTime,@LogoutTime,@DeviceType);select @@IDENTITY',
N'@UserID int,@LoginTime datetime,@LogoutTime datetime,@DeviceType int',
@UserID=2,
@LoginTime='2012-07-27 16:25:49.270',
@LogoutTime=NULL,
@DeviceType=1

exec Add_LoginHistory 2,'2012-07-27 16:25:49.270',null,1

insert into [LoginHistory]([UserID],[LoginTime],[LogoutTime],[DeviceType]) 
values (2,'2012-07-27 16:25:49.270',null,1);

理论上不用变量应该是最快的,但是我本地测试却不是,貌似我机器不正常了....
------解决方案--------------------
引用:
在并发量300的时候最长执行时间需要120ms,该表只有一个唯一主键ID, identity1,1)和一个外键。
且该表中数据量目前不超过2w,请问大家一下,还有优化的空间吗?

对于历史表,其实是不需要外键的,建议删除.
------解决方案--------------------
引用:
引用:
在并发量300的时候最长执行时间需要120ms,该表只有一个唯一主键ID, identity1,1)和一个外键。
且该表中数据量目前不超过2w,请问大家一下,还有优化的空间吗?

对于历史表,其实是不需要外键的,建议删除.

完全同意,干掉外键。
------解决方案--------------------
这个语句已经很简单了,没什么好优化的
把外键删除试试看吧
------解决方案--------------------
恩,去掉外键再看看
------解决方案--------------------
删除主键,去掉聚集索引。
------解决方案--------------------