问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请问下 谁有inside microsoft sql server 2008 t-sql programming 的样例数据库InsideTSQL2008.sql啊?

发布网友 发布时间:2022-05-03 16:20

我来回答

2个回答

热心网友 时间:2022-05-03 17:49

优化存储过程有很多种方法,下面介绍最常用的7种。

1.使用SET NOCOUNT ON选项

我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数。使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量。

2.使用确定的Schema

在使用表,存储过程,函数等等时,最好加上确定的Schema。这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索。而且搜索会导致编译锁定,最终影响性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable会在当前Schema下搜索,如果没有,再去dbo下面搜索,影响性能。而且如果你的表是csdn.TestTable的话,那么select * from TestTable会直接报找不到表的错误。所以写上具体的Schema也是一个好习惯。

3.自定义存储过程不要以sp_开头

因为以sp_开头的存储过程默认为系统存储过程,所以首先会去master库中找,然后在当前数据库找。建议使用USP_或者其他标识开头。

4.使用sp_executesql替代exec

原因在Inside Microsoft SQL Server 2005 T-SQL Programming书中的第四章Dynamic SQL里面有具体描述。这里只是简单说明一下:sp_executesql可以使用参数化,从而可以重用执行计划。exec就是纯拼SQL语句。

5.少使用游标

可以参考Inside Microsoft SQL Server 2005 T-SQL Programming书中的第三章Cursors里面有具体描述。总体来说,SQL是个集合语言,对于集合运算具有较高的性能,而Cursors是过程运算。比如对一个100万行的数据进行查询,游标需要读表100万次,而不使用游标只需要少量几次读取。

6.事务越短越好

SQL Server支持并发操作。如果事务过多过长,或是隔离级别过高,都会造成并发操作的阻塞,死锁。此时现象是查询极慢,同时cup占用率极低。

7.使用try-catch来处理错误异常

SQL Server 2005及以上版本提供对try-catch的支持,语法为:

begin try

----your code

end try

begin catch

--error dispose

end catch

一般情况可以将try-catch同事务结合在一起使用。

begin try

begin tran

--select

--update

--delete

--…………

commit

end try

begin catch

--if error

rollback

end catch

====================== 分割线 =======================

『自己的一些调优经验』

1. 少使用游标是个很好的建议,为此,我自己也遇到过一些事故,是游标所造成的,由于,游标是逐行逐行操作的,当记录较多时,经常会遇到超时的情况。

2. 多表join做查询时,查询的字段尽量不要使用case when then else end的语法,或者使用用户函数,例如:

select (case when fType=1 then '是' else '否' end) as fTypeName, dbo.F_GetFullName(fID) as fFullName from Table1 inner join Table2……

当两个表的数据量非常大时,你可以在查询分析器中明显感觉到:直接查询fType和fID与查询上面两个字段的速度,很可能使用了一个case when then就导致超时。

针对这种情况,可以分两种做法:

第一,把一些简单的转换可以放在程序中完成。

第二,如果需要通过ID查询全名或者全称,类似的,可以创建好视图,直接查视图,或者,先把所有的fFullName查出来放到临时表中,直接join临时表(如果这个数据不是很多的话),获得fFullName。

3. 少使用一些嵌套的查询,用临时表缓存中间数据,例如:

select * from Table1

inner join (

select count(1) as count, Table2.ID2 from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2

) as t1 on t1.ID1 = Table1.ID1

我曾经遇到这样情况,上面的语句是那种情况的简化版本,把其他不影响结果的表格都去掉了,发现一个奇怪的现象:嵌套查询的结果集并不大,大约就200多行,Table1有6w条记录,结果,这个查询语句超时,查询分析器中执行2分钟也得不到结果。

后来,这样一改,就Ok了,3秒出结果:

select count(1) as count, Table2.ID2 into #temp from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2

select * from Table1

inner join #temp as t1 on t1.ID1 = Table1.ID1

这样一改,效率提升了几十倍,猜想:可能是嵌套的查询是动态的,每一行的join可能都需要先执行嵌套的查询,从而导致效率极差。

所以,如果查询足够复杂,join多个表,需要连接多个通过group by求和、求平均数等运算计算出来的中间数据,那么,不妨多使用临时表缓存中间数据。

4. 还有一些是必须遵守的一些默认规则,比如:

先过滤后连接。

查询的字段最要不要用“*”,指定需要用的字段,减少网络流量。

『总结』

对于性能的追求是没有极限的,做到你所能做到的,这是一个很好的习惯。

有些业务逻辑放在存储过程中处理比较方便,而有些业务逻辑交给程序来处理,同样会提升系统整体的效率,看实际情况而定。

总之,尽可能减少这些容易引发性能问题的隐患,系统就会跑得更稳定更有效率,一切从小细节做起。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 Sql Server 2005外围应用应用配置器打不开了怎么办 sql server 2008数据库安装出现错误,无法连接WMI服务器(xp系统) sql server 2005 配置管理器 sql server2005配置管理器打不开 无法连接到WMI提供程序咋解决 我的 SQLSERVER2005的配置管理器打不开,显示“无法连接到WMI提供程序。您没有权限或者该服务器无法访问 sql2012配置管理器无法提供wmi程序怎么办 sql去重,列转行 在sql中把insert into ttt和 ( select id, stuff(txt,charindex('|',txt),1,'-') from total2)结合? SQL Server2000将一列数据拼接成字符串可以用STUFF FOR XML PATH()么 sqlsever STUFF函数如何返回一个ntext sql stuff 顺序 access 中如何实现 sql server中的stuff函数,急。。。可加分~ sql 使用stuff为什么查询很慢 SQL中CHARINDEX,REPLACE,STUFF,CONVERT各有什么用处?怎么用? 紧迫求肋 python 赌暌姑什么类型的变量保留 mssql 中的varbinary类型 python 在MSSQL中insert into 的问题 python+webpy连接mssql参数化查询的问题 请问哪位朋友可以回答下关于ACCESS。SQLSERVER。MYSQL技术的问题, 因为我是新人,所以请用简单理解的方式 sqlserver 如何修改存储过程的名字 注册个会员等等,都要邮箱验证,这样做的目的是什么?? asp C#Web,向sql插入数据,不使用存储过程的话有必要用Parameters属性吗, 如何将SQL Server 2008的数据降级到SQL Server 2005 如何将SQL Server2008 还原至 SQL Server2005 中 如何转换SQL Server 2008数据库到SQL Server 2005 如何将sql sever 2008的数据库转化成sql server 2005数据库 sql2008的数据降级到sql2005时出错,如何操作? 谁可以帮我把SQL Server2008文件降级为2005版本的,求助求助啊 sql Server 怎么把2008高版本数据库用在2005版本上啊 sqlserver2008数据库怎么转换成sqlserver2005数据库 sql2008转移到sql2005 求帮忙转一下sql server2008的数据库到2005、需要2008转、我的是2005 如何把SqlServer2008的数据库转成2005的? 谁可以帮我把一个SQL2008数据库文件转成2005的 SQL 2008上建的数据库如何最方便的还原至SQL2000上 请问如何将SQL2008数据库的MDF LDF转换成2000的数据库? sql server 2008的sql语句怎么转换成sql server 2000格式的SQL语句? sqlserver 2008 如何生成sqlserver2000 的bak文件? SqlServer2008的数据库如何和2000中的数据库数据同步? 高手帮忙,MSSQL SERVER 2000如何将存储过程导入另外一个数据库?(不要通过脚本哦,比较麻烦) sql2005备份的数据库怎么还原到sql2008