承德做网站优化,好看的单页面网站,大公司网页设计用什么软件好,河北网站建设有限公司一、开门见山#xff0c;问题所在sql语句性能达不到你的要求#xff0c;执行效率让你忍无可忍#xff0c;一般会时下面几种情况。网速不给力#xff0c;不稳定。服务器内存不够#xff0c;或者SQL 被分配的内存不够。sql语句设计不合理没有相应的索引#xff0c;索引不合…一、开门见山问题所在sql语句性能达不到你的要求执行效率让你忍无可忍一般会时下面几种情况。网速不给力不稳定。服务器内存不够或者SQL 被分配的内存不够。sql语句设计不合理没有相应的索引索引不合理没有有效的索引视图表数据过大没有有效的分区设计数据库设计太2存在大量的数据冗余索引列上缺少相应的统计信息或者统计信息过期....那么我们如何给找出来导致性能慢的的原因呢首先你要知道是否跟sql语句有关确保不是机器开不开机服务器硬件配置太差没网你说p啊接着你使用我上一篇文章中提到的2柯南sql性能检测工具--sql server profiler分析出sql慢的相关语句就是执行时间过长占用系统资源cpu过多的然后是这篇文章要说的sql优化方法跟技巧避免一些不合理的sql语句取暂优sql再然后判断是否使用啦合理的统计信息。sql server中可以自动统计表中的数据分布信息定时根据数据情况更新统计信息是很有必要的确认表中使用啦合理的索引这个索引我前面博客中也有提过不过那篇博客之后还要进一步对索引写篇文章数据太多的表要分区缩小查找范围二、分析比较执行时间计划读取情况select * from dbo.Product执行上面语句一般情况下只给你返回结果和执行行数那么你怎么分析呢怎么知道你优化之后跟没有优化的区别呢。下面给你说几种方法。1.查看执行时间和cpu占用时间set statistics time onselect * from dbo.Productset statistics time off打开你查询之后的消息里面就能看到啦。2.查看查询对I/0的操作情况set statistics io onselect * from dbo.Productset statistics io off执行之后扫描计数索引或表扫描次数逻辑读取数据缓存中读取的页数物理读取从磁盘中读取的页数预读查询过程中从磁盘放入缓存的页数lob逻辑读取从数据缓存中读取imagetextntext或大型数据的页数lob物理读取从磁盘中读取imagetextntext或大型数据的页数lob预读查询过程中从磁盘放入缓存的imagetextntext或大型数据的页数如果物理读取次数和预读次说比较多可以使用索引进行优化。如果你不想使用sql语句命令来查看这些内容方法也是有的哥教你更简单的。查询---查询选项---高级被红圈套上的2个选上去掉sql语句中的set statistics io/time on/off 试试效果。哦也你成功啦。。3.查看执行计划执行计划详解选中查询语句点击然后看消息里面会出现下面的图例首先我这个例子的语句太过简单你整个复杂的包涵啊。分析鼠标放在图标上会显示此步骤执行的详细内容每个表下面都显示一个开销百分比分析站百分比多的的一块可以根据重新设计数据结构或这重写sql语句来对此进行优化。如果存在扫描表或者扫描聚集索引这表示在当前查询中你的索引是不合适的是没有起到作用的那么你就要修改完善优化你的索引。三、select查询艺术1.保证不查询多余的列与行。尽量避免select * 的存在使用具体的列代替*避免多余的列使用where限定具体要查询的数据避免多余的行使用topdistinct关键字减少多余重复的行2.慎用distinct关键字distinct在查询一个字段或者很少字段的情况下使用会避免重复数据的出现给查询带来优化效果。但是查询字段很多的情况下使用则会大大降低查询效率。由这个图分析下:很明显带distinct的语句cpu时间和占用时间都高于不带distinct的语句。原因是当查询很多字段时如果使用distinct数据库引擎就会对数据进行比较过滤掉重复数据然而这个比较过滤的过程则会毫不客气的占用系统资源cpu时间。3.慎用union关键字此关键字主要功能是把各个查询语句的结果集合并到一个结果集中返回给你。用法unionunion...满足union的语句必须满足1.列数相同。 2.对应列数的数据类型要保持兼容。执行过程依次执行select语句--合并结果集---对结果集进行排序过滤重复记录。select * from((orde o left join orderproduct op on o.orderNum op.orderNum) inner join product p on op.proNum p.productnum) where p.id 10000unionselect * from((orde o left join orderproduct op on o.orderNum op.orderNum) inner join product p on op.proNum p.productnum) where p.id 20000 and p.id 10000unionselect * from((orde o left join orderproduct op on o.orderNum op.orderNum) inner join product p on op.proNum p.productnum) where p.id 20000-- -这里可以写p.id 100 结果一样 因为他筛选过啦 -- -- -- -对比上下两个语句-- -- -- -- select * from((orde o left join orderproduct op on o.orderNum op.orderNum) inner join product p on op.proNum p.productnum)由此可见效率确实低所以不是在必要情况下避免使用。其实有他执行的第三部对结果集进行排序过滤重复记录。就能看出不是什么好鸟。然而不对结果集排序过滤显然效率是比union高的那么不排序过滤的关键字有吗答有他是union all使用union all能对union进行一定的优化。。4.判断表中是否存在数据select count(*) from product select top(1) id from product很显然下面完胜5.连接查询的优化首先你要弄明白你想要的数据是什么样子的然后再做出决定使用哪一种连接这很重要。各种连接的取值大小为内连接结果集大小取决于左右表满足条件的数量左连接取决与左表大小右相反。完全连接和交叉连接取决与左右两个表的数据总数量select * from ( (select * from orde where OrderId10000) o left join orderproduct op on o.orderNumop.orderNum )select * from ( orde o left join orderproduct op on o.orderNumop.orderNum )where o.OrderId10000由此可见减少连接表的数据数量可以提高效率。四、insert插入优化--创建临时表create table# tb1 ( id int, name nvarchar(30), createTime datetime )declare i intdeclare sql varchar(1000)set i 0while (i 100000) --循环插入10w条数据beginset i i 1set sql insert into #tb1 values (convert(varchar(10),i), erzi convert(nvarchar(30), i) , convert(nvarchar(30), getdate()) ) exec(sql) end我这里运行时间是51秒--创建临时表create table# tb2 ( id int, name nvarchar(30), createTime datetime )declare i intdeclare sql varchar(8000)declare j intset i 0while (i 10000) --循环插入10w条数据beginset j 0set sql insert into #tb2 select convert(varchar(10), i * 100 j) ,erzi convert(nvarchar(30), i * 100 j) , convert(varchar(50), getdate()) set i i 1while (j 10) beginset sql sql union all select convert(varchar(10), i * 100 j) ,erzi convert(nvarchar(30),i*100j),convert(varchar(50),getdate())set j j 1endexec(sql)enddrop table# tb2select count(1) from# tb2我这里运行时间大概是20秒分析说明insert into select批量插入明显提升效率。所以以后尽量避免一个个循环插入。五、优化修改删除语句如果你同时修改或删除过多数据会造成cpu利用率过高从而影响别人对数据库的访问。如果你删除或修改过多数据采用单一循环操作那么会是效率很低也就是操作时间过程会很漫长。这样你该怎么做呢折中的办法就是分批操作数据。delete product where id1000delete product where id1000 and id2000delete product where id2000 and id3000.....当然这样的优化方式不一定是最优的选择其实这三种方式都是可以的这要根据你系统的访问热度来定夺关键你要明白什么样的语句是什么样的效果。总结优化最重要的是在于你平时设计语句数据库的习惯方式。如果你平时不在意汇总到一块再做优化你就需要耐心的分析然而分析的过程就看你的悟性需求知识水平啦。Java肖先生专注于Java开发技术的研究与知识分享————END————点赞(编辑不易感谢您的支持)...转发(分享知识传播快乐)...关注(每天更新Java开发技术)...推荐阅读看到网上疯传的《阿里Java架构师成长之路》网友瞬间沸腾了Java程序员备战“金九银十”必备的面试技巧(附阿里Java岗面试题)