JAVA(SQL语句的优化).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA(SQL语句的优化)

一、SQL 编写注意事项(标准) 在多在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于大量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一 般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来用索引,这有助于写出高性能的SQL语句。 改成下面: 二、SQL语句的编写原则:●选择一个好的表联接顺序(这是一个比较重要的原则)当在WHERE子句中有多个表联接时,WHERE子句中排在最后的表应当是返回行数可能最少的表,有过滤条件的子句应放在WHERE子句中的最后。 如:设从emp表查到的数据比较少或该表的过滤条件比较确定,能大大缩小查询范围,则将最具有选择性部分放在WHERE子句中的最后: select?*?from?emp?e,dept?d?where?d.deptno?10?and?e.deptno?=30;?如果dept表返回的记录数较多的话,上面的查询语句会比下面的查询语句响应快得多。 select?*?from?emp?e,dept?d?where?e.deptno?=30?and?d.deptno?10; ●最好不要在WHERE子句中使用函或表达式,如果要使用的话,最好统一使用相同的表达式或函数,这样便于以后使用合理的索引。SELECT?* FROM?T1 WHERE ?F1*2 = 100 ?改成 ?SELECT?*FROM?T1 WHERE F1 = 100/2 ●?使用WHERE?(NOT)EXISTS?来代替(NOT)IN子句,使用NOT?EXISTS?子句可以有效地利用索引。 尽可能使用NOT?EXISTS来代替NOT?IN,尽管二者都使用了NOT(NOT IN不能使用索引而降低速度),NOT?EXISTS要比NOT?IN查询效率更高。 例子:? SELECT?dname,?deptno?FROM?dept?WHERE?deptno?NOT?IN?(SELECT?deptno?FROM?emp);? 例子: SELECT?dname,?deptno?FROM?dept?WHERE?NOT?EXISTS?(SELECT?deptno?FROM?emp?WHERE?dept.deptno?=?emp.deptno);? 明显的,2要比1的执行性能好很多。 因为1中对emp进行了,这是很浪费时间的操作。而且1中没有用到emp的,?因为没有where子句。而2中的语句对emp进行的是缩小范围的查询。 ●?通过使用=、=等,避免使用NOT命令 如这个例子: select?*?from?employee?where?salary3000;? 对这个查询,可以改写为不使用NOT: select?*?from?employee?where?salary3000?or?salary3000;? 虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。 ● 外部联接 + 的用法外部联接+按其在=的左边或右边分左联接和右联接。若不带+运算符的表中的一个行不直接匹配于带+预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回。利用外部联接+,可以替代效率十分低下的?not?in?运算,大大提高运行速度。例如,下面这条命令执行起来很慢: select?a.empno?from?emp?a?where?a.empno?not?in (select?empno?from?emp1?where?job=‘SALE’); 索引倘若利用外部联接,改写命令如下:? select?a.empno?from?emp?a left join emp1?b? on?a.empno=b.empno? where?b.empno?is?null? and?b.job=‘SALE’; 例如表少,但情况复杂的时候应该写如下语句: select a.empno AS empno, (select emp2.address from emp2 where a.id=emp2.id) AS address

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档