仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 669|回复: 7
打印 上一主题 下一主题

[学习教程] 浅谈SQL语句优化的几种办法(一)

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:18:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
2008年1月16号MySQLAB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。SQL语句优化是每一个程序员与DBA必不成少的一门课程,本章就跟从小编一同来切磋一下SQL语句优化应当注重的几个方面吧。

1,把持毗连表中纪录数目。
我们在多表查询的时分,用的最多的生怕就是内毗连(innerjoin)与摆布毗连了(leftjoin与rightjoin)了。但我们改一下SQL的实行按次,以削减毗连表中的纪录数,则能够进步查询的效力.以下语句:
select*fromt1leftjoint2wheret1.id=t2.idandt1.id>800andt2.id<500

假如我们用子查询取代毗连表,以削减毗连表中的纪录数,再来婚配,查询效力是不是能进步了?
sql改写以下:
select*from(select*fromt1wheret1.id>800)aleftjoin(select*fromt2wheret2.id<500)bona.id=b.id.

如许写的语句固然庞大,但的确能够进步查询效力。可是,倡议仅在数据量十分年夜的情形下用该办法,由于数据量小的情形下效果会很不分明,并且影响语句的可读性。

2,把持查询中行与列的数目

2.1削减结查会合的行数。
(1)利用where子句。
能够在select语句中利用where前提选择出我们必要的纪录,再用了局集做进一步的查询,第一点实在就是该办法的详细使用。

(2)利用top关头字。
假如我们断定查询纪录的数目,那末可使用top来限定了局会合的纪录数目,而不是把一切了局查询出来再在前台程序中取断定的纪录数,好比,我们要查询最新的100个消耗纪录,可使用以下select语句:
selecttop100*fromconsumeorderbycreatedatedesc

如查不必top关头字,则select语句以下:
select*fromconsumeorderbycreatedatedesc

显现,前者将年夜年夜进步查询的速率。

(3)得当的利用distinct关头字
当select语句只前往一列数据时,并且了局会合存在良多反复数据的时分,可使用distinct关头字来削减了局会合的纪录数目,以下:
selectdistinctcardonfromconsume

注重:并非一切情形都合适利用distinct关头字的,假如利用不妥,反而会下降查询效力.详细缘故原由请看本站浅谈SQL语句优化的几种办法(二)

2.2削减了局会合的列的数目
应当只管制止在select语句利用*来暗示要查询的列,因这会前往表中一切的列。并且假如在视图中利用*,那末在表布局变更时,视图的列还会错位。我们应当明白列出要查询的列,制止了局会合不呈现大批不必要的列。出格是text,varchar(max)等年夜数据量的列,能不必到,就必定不在select的列中呈现。
以下语句:
select*fromconsume

应当改成:
selectid,name,model,unitfromconsume

注重,出格是在多表的团结查询中,该办法更现主要,利用*不但会增添了局集的数据量,另有大概会形成了局会合有反复列的的毛病,以是出格不保举在select中利用*号。因此我们的方案中要构造这种逆操作。Event_type增加一种FlashBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。
老尸 该用户已被删除
沙发
发表于 2015-1-18 12:43:13 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
海妖 该用户已被删除
板凳
发表于 2015-2-1 10:57:01 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
蒙在股里 该用户已被删除
地板
发表于 2015-2-7 05:01:59 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
分手快乐 该用户已被删除
5#
发表于 2015-2-20 21:21:58 | 只看该作者
我个人认为就是孜孜不懈的学习
6#
发表于 2015-3-6 19:11:03 | 只看该作者
我们学到了什么?思考问题的时候从表的角度来思考问
山那边是海 该用户已被删除
7#
发表于 2015-3-13 07:24:21 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
透明 该用户已被删除
8#
发表于 2015-3-20 16:47:42 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表