系统调优之查询优化日记开篇

  从今天开始,连载比较经典的数据库查询问题,并提供解决方法,希望对大家有帮助,同时大家也可以跟帖多提建议和更好的解决方案

所有语句都是用sql的事件探查器结合查询分析器进行
建议大家对所有问题语句先仔细看,跟周围人一起看来理解查询的意思,然后再看后面的分析,否则不利于理解
对于索引的建立和优化修改因情况复杂,在每个案例中不做详细解释,会集中讲解
对于大并发环境使用sql语句,要严格养成和遵守以下规则:

1、所有系统都是要定期优化的,但这决不是我们初期可以随便设计和随便写的理由,嘴在你身上,该用的时候就用,在不知道学习方法时,最好的方法就是询问和讨论
2、硬件是可以升级的,但不是买个服务器那么简单,很多查询,服务器没我们想像的永远那么快,因为他不是只做这个查询,就象研发也不是天天在那里等任务一样
3、开发速度和系统的严谨高效不矛盾,缺的只是好的习惯和对自己的要求

4、只要是查询,就使用客户端游标而不是默认的服务器端游标
5、每个查询无论简单与否,都要认真到查询分析器里分析执行过程后再决定使用,因为你不是数据库
6、在查询时,只查询和返回要的数据,不要的数据就不要把他弄进来,做分页显示时尤其如此
7、优化(建索引)不只是为了select查询,对于delete和update也是非常重要的(delete和update其实也是先找到记录才做动作的)
8、建立普通的视图只是帮你把复杂的查询封装了,并不能提高查询速度,每次调用视图,视图都是要去实际查询一下的。
9、在我们要更新或删除大量数据时(一般情况下绝对不建议啊,除非经至少部门经理同意),如果记录可每5000条做一下,那就不要每10000条做下(此处数字只是做个例子),因为数据库是要记录操作日志的,这也是很耗资源的,虽然我们分开做的完成速度慢了些,但至少可以保证完成,而一次操作大量数据很可能因影响范围太大而完不成,数据库再回滚,一场灾难产生了。
10、修改数据表结构、修改字段名和字段类型,甚至调整下字段顺序(其实没必要),都是把数据表重新复制了一遍,然后把旧表删除,把新表再改回原名,所以大表修改时的后果可想而知,想想第8条。但给已有字段添加修改注释还是可以接受的
11、sqlserver提供的很多内置函数和运算表达式,没你想像的那么好,至少在sql语句的查询和排序条件里坚决不要出现,你一定可以有其他替代办法的,比如最常用的日期比较函数就是个典型的容易让人出问题的函数
12、尽量避免出现 not、<>、or、in  等等让事情变复杂的符号,而是多用=、>、>=、<、<=等等结果和范围明确的符号,因为索引本来就是为符合条件而生,当我们跟数据库说要不符合条件的,索引就不那么高效了
13、like关键字不能随便用,但如果有其他条件可以把like的范围缩小,比如筛选到只有几百条记录要like,那么性能基本可以接受,千万不要对一个大表直接就上like
14、所有非关键查询(不涉及钱和名额的我觉得都不算关键)建议加上with (nolock)的查询提示,减少阻塞(这不是提速语句,但阻塞少了,系统也会变快)
15、所有直接提交的sql语句务必在语句结尾加上注释(说明是哪个页面里的哪个函数里用的),便于sql事件探查器捕捉到后,可以快速定位问题语句的位置
16、优化不是单纯用索引就可以搞定的,优化是个枯燥长期但有成就感的事情,当需要改动数据库结构才能起作用时,就需要跟团队一起讨论,尽快制订完善的改动计划,让团队的人都知道如何改动,哪些地方要改动,而不是一个人就直接动手改,别人都不知道,否则最后的结果就是错误一大堆,老的查询语句没全部改掉,大家再来擦pp

上面的如果你做不到,下面的你也没必要看了,改行吧


不想改行的各位,首先发上今天的经典问题语句
select top 10 c.MemberId,d.UserName as MemberName,c.Finance,c.DPNum,d.user_photo as UserPic from  (select top 10 a.MemberId, sum(a.Amount) as Finance,(select count(*) from [17uEbooking].[dbo].[HotelDianping] e where a.MemberId=e.MemberId) as DPNum from [17uEbooking].[dbo].[MemberAmountDetail] a inner join [17uEbooking].[dbo].[MemberInfo] b on a.MemberId =b.MemberId where a.CreateDate>'2007-8-1' and a.CreateDate <'2009-7-31' and a.Flag='1' and a.AmountType='HousePrize' group by a.MemberId order by a.Finance desc) c left outer join B2C_user d on c.MemberId = d.[Id] order by  Finance desc ;

以上句子请认真看,脑子里模仿下数据库把各个表进行连接,一定会发现一个低级问题


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值