存储过程优化

boboluping 2009-04-25 10:59:16
最近,遇到一个项目,每秒大概有2000次,对2000张表的插入操作。每1次的数据量是200个字节,并且表的数量是不确定的,是随着设备的新增而增加的。我写了如下一个存储过程:
create proc add_GPSInfo
@tableName varchar(30),
@sLongitude varchar(50),
@sLatitude varchar(50),
@sStatus int,
@sDataType int,
@sHeading real,
@sSpeed real,
@sGpsTime varchar(30),
@sMiles varchar(10)
AS
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].['+@TableName+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
begin
exec('INSERT INTO ' +@tableName+ ' (Longitude,Latitude,Status,DataType,Heading,Speed,GpsTime,Miles) VALUES ('''+@sLongitude+''','''+@sLatitude+''','+@sStatus+','+@sDataType+','+@sHeading+','+@sSpeed+','''+@sGpsTime+''','+@sMiles+')' );
end
else
begin exec(
'CREATE TABLE [dbo].['+@tableName+'] (
[Longitude] [float] NULL ,
[Latitude] [float] NULL ,
[Status] [int] NULL ,
[DataType] [int] NULL ,
[Heading] [real] NULL ,
[Speed] [real] NULL ,
[GpsTime] [datetime] NULL ,
[Miles] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]'
);
exec('INSERT INTO ' +@tableName+ ' (Longitude,Latitude,Status,DataType,Heading,Speed,GpsTime,Miles) VALUES ('''+@sLongitude+''','''+@sLatitude+''','+@sStatus+','+@sDataType+','+@sHeading+','+@sSpeed+','''+@sGpsTime+''','+@sMiles+')' );
end

GO

在这里,请教一下各位,如果不该表思路,在SQL语句层面上,这个存储过程还可以怎么优化一下呢?
...全文
84 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
boboluping 2009-04-27
  • 打赏
  • 举报
回复
看来是个高手。
[Quote=引用 10 楼 fcuandy 的回复:]
引用 2 楼 szx1999 的回复:
你的存储过程应该报错。
@sStatus等字段是int型,你未作任何转换而进行了字符串拼接。



理论是死的,不能照搬.

exec(....)这里跟的任何拼接变量会尝试转varchar,nvarhcar,char,...,因为它只接收这样的参数, 所以这里不对int显式转换为字串是不错的,反而显式写了转换倒会报错.

其实用select into和insert select 还是有区别的, 并不是说select into因为避免了一些检查效率高些就一定…
[/Quote]
fcuandy 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 szx1999 的回复:]
你的存储过程应该报错。
@sStatus等字段是int型,你未作任何转换而进行了字符串拼接。
[/Quote]


理论是死的,不能照搬.

exec(....)这里跟的任何拼接变量会尝试转varchar,nvarhcar,char,...,因为它只接收这样的参数, 所以这里不对int显式转换为字串是不错的,反而显式写了转换倒会报错.

其实用select into和insert select 还是有区别的, 并不是说select into因为避免了一些检查效率高些就一定适用的.

select into 会占用系统表资源,可能会造成一些操作阻塞.

IAmXirour 2009-04-27
  • 打赏
  • 举报
回复
呵呵,我对这句比较感兴趣:
select '小笨笨' as colname into newtable
Q315054403 2009-04-26
  • 打赏
  • 举报
回复
设计腐化啊。。。既然结构相同,一个表就OK喽
等不到来世 2009-04-25
  • 打赏
  • 举报
回复
尽管不太合理,居然真的没报错。。。
我败了。。。

else部分可以考虑用select ... into ...的方式,将建表和插入数据合二为一。
boboluping 2009-04-25
  • 打赏
  • 举报
回复
过程并没有报错,因为已经实际使用起来了。只是感觉,这个写出来好繁琐。
duanzhi1984 2009-04-25
  • 打赏
  • 举报
回复
语句并不复杂,已经是最简化的了
等不到来世 2009-04-25
  • 打赏
  • 举报
回复
存储过程问题还很多,不想写了

给个小提示,新建一个表可以直接这么写:
select '小笨笨' as colname into newtable
等不到来世 2009-04-25
  • 打赏
  • 举报
回复
你的存储过程应该报错。
@sStatus等字段是int型,你未作任何转换而进行了字符串拼接。
  • 打赏
  • 举报
回复
都是简单的sql,貌似没办法优化了
boboluping 2009-04-25
  • 打赏
  • 举报
回复
这位仁兄,别败啊,SQL我不了解,这是临时抱佛脚。而且现在这个有个问题是什么呢?会有一段时间某个表插不进去数据,导致一部分的GPS数据丢失了。我在设置了locktimeout 0之后,截止到目前,运行良好。没有再丢过数据了,可能会有几个丢的,但是不会出现一段时间没数据了。
[Quote=引用 6 楼 szx1999 的回复:]
尽管不太合理,居然真的没报错。。。
我败了。。。

else部分可以考虑用select ... into ...的方式,将建表和插入数据合二为一。
[/Quote]

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧