欢迎来到天天文库
浏览记录
ID:28499732
大小:214.29 KB
页数:13页
时间:2018-12-10
《不得不看,只有专家才知道的17个SQL查询提速秘诀!.docx》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、北大青鸟华美官网:www.hmaccp.com通常,开发人员找到自己青睐的方法,而懒得研究其他方法。这也许是缺乏教育的表现,或者开发人员没有认识到自己何时做错了。也许针对一组本地测试数据,查询运行起来顺畅,但是换成生产级系统,表现就差强人意。除非你遵循本文介绍的这些技巧,否则很容易编写出减慢查询速度或锁死数据库的数据库代码。由于数据库领域仍相对不成熟,每个平台上的SQL开发人员都在苦苦挣扎,一次又一次犯同样的错误。当然,数据库厂商在取得一些进展,并继续在竭力处理较重大的问题。无论SQL开发人员在SQLServer、Oracle、DB2、S
2、ybase、MySQL,还是在其他任何关系数据库平台上编写代码,并发性、资源管理、空间管理和运行速度都仍困扰着他们。问题的一方面是,不存在什么灵丹妙药;针对几乎每条最佳实践,我都可以举出至少一个例外。北大青鸟华美官网:www.hmaccp.com通常,开发人员找到自己青睐的方法,而懒得研究其他方法。这也许是缺乏教育的表现,或者开发人员没有认识到自己何时做错了。也许针对一组本地测试数据,查询运行起来顺畅,但是换成生产级系统,表现就差强人意。我没有期望SQL开发人员成为管理员,但他们在编写代码时必须考虑到生产级环境的问题。如果他们在开发初期不
3、这么做,数据库管理员后期会让他们返工,遭殃的就是用户。我们说调优数据库既是门艺术,又是门科学,这是有道理的,因为很少有全面适用的硬性规则。你在一个系统上解决的问题在另一个系统上不是问题,反之亦然。说到调优查询,没有正确的答案,但这并不意味着就此应该放弃。你可以遵循以下17条原则,有望收到很好的效果。不要用UPDATE代替CASE这个问题很常见,却很难发觉,许多开发人员常常忽视这个问题,原因是使用UPDATE再自然不过,这似乎合乎逻辑。以这个场景为例:你把数据插入一个临时表中,如果另一个值存在,需要它显示某个值。也许你从Customer表中
4、提取记录,想把订单金额超过100000美元的客户标记为“Preferred”。因而,你将数据插入到表中,运行UPDATE语句,针对订单金额超过100000美元的任何客户,将CustomerRank这一列设为“Preferred”。问题是,UPDATE语句记入日志,这就意味着每次写入到表中,要写入两次。北大青鸟华美官网:www.hmaccp.com解决办法:在SQL查询中使用内联CASE语句,这检验每一行的订单金额条件,并向表写入“Preferred”标记之前,设置该标记,这样处理性能提升幅度很惊人。不要盲目地重用代码这个问题也很常见,我们
5、很容易拷贝别人编写的代码,因为你知道它能获取所需的数据。问题是,它常常获取过多你不需要的数据,而开发人员很少精简,因此到头来是一大堆数据。这通常表现为WHERE子句中的一个额外外连接或额外条件。如果你根据自己的确切要求精简重用的代码,就能大幅提升性能。需要几列,就提取几列这个问题类似第2个问题,但这是列所特有的。很容易用SELECT*来编写所有查询代码,而不是把列逐个列出来。问题同样是,它提取过多你不需要的数据,这个错误我见过无数次了。开发人员对一个有120列、数百万行的表执行SELECT*查询,但最后只用到其中的三五列。因此,你处理的数
6、据比实际需要的多得多,查询返回结果是个奇迹。你不仅处理过多不需要的数据,还夺走了其他进程的资源。不要查询两次(double-dip)这是我看到好多人犯的另一个错误:写入存储过程,从一个有数亿行的表中提取数据。北大青鸟华美官网:www.hmaccp.com开发人员想提取住在加利福尼亚州,年收入高于4万美元的客户信息。于是,他查询住在加利福尼亚州的客户,把查询结果放到一个临时表中。然后再来查询年收入高于4万美元的客户,把那些结果放到另一个临时表中。最后他连接这两个表,获得最终结果。你是在逗我吧?这应该用一次查询来完成,相反你对一个超大表查询两
7、次。别犯傻了:大表尽量只查询一次,你会发现存储过程执行起来快多了。一种略有不同的场景是,某个过程的几个步骤需要大表的一个子集时,这导致每次都要查询大表。想避免这个问题,只需查询这个子集,并将它持久化存储到别处,然后将后面的步骤指向这个比较小的数据集。知道何时使用临时表这个问题解决起来要麻烦一点,但效果显著。在许多情况下可以使用临时表,比如防止对大表查询两次。还可以使用临时表,大幅减少连接大表所需的处理能力。如果你必须将一个表连接到大表,该大表上又有条件,只需将大表中所需的那部分数据提取到临时表中,然后再与该临时表连接,就可以提升查询性能。
8、如果存储过程中有几个查询需要对同一个表执行类似的连接,这同样大有帮助。预暂存数据这是我最爱聊的话题之一,因为这是一种经常被人忽视的老方法。如果你有一个报表或存储过程(或一组)要对大表执行类似的
此文档下载收益归作者所有