浅谈SQL性能优化的十条措施

发表于:2011-8-03 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:月夜清风    来源:51Testing软件测试网采编

分享:

  6、在WHERE 语句中,尽量避免对索引字段进行计算操作

  这个常识相信绝大部分开发人员都应该知道,但仍有不少人这么使用,我想其中一个最主要的原因可能是为了编写写简单而损害了性能,那就不可取了。9月份在对XX系统做性能分析时发现,有大量的后台程序存在类似用法,如:where trunc(create_date)=trunc(:date1),虽然已对create_date 字段建了索引,但由于加了TRUNC,使得索引无法用上。此处正确的写法应该是where create_date>=trunc(:date1) and create_date< pre=""><>或者是where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)。

  注意:因between 的范围是个闭区间(greater than or equal to low value and less than or equal to high value.),故严格意义上应该再减去一个趋于0的小数,这里暂且设置成减去1秒(1/(24*60*60)),如果不要求这么精确的话,可以略掉这步。

  7、对Where 语句的法则

  7.1 避免在WHERE子句中使用in,not  in,or 或者having。

  可以使用 exist 和not exist代替in和not in。

  可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。

  例子

  • SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN   
  • (SELECT CUSTOMER_NAME FROM CUSTOMER)
  •   优化

  • SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist   
  • (SELECT CUSTOMER_NAME FROM CUSTOMER)
  •   7.2 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。

      例子使用:

      SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;

      --不要使用:

      SELECT emp.ename, emp.job FROM emp WHERE emp.empno = '7369'

      8、对Select语句的法则

      在应用程序、包和过程中限制使用select * from table这种方式。看下面例子

      --使用

      SELECT empno,ename,category FROM emp WHERE empno = '7369'

      --而不要使用

      SELECT * FROM emp WHERE empno = '7369'

      9、排序

      避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。

      10、临时表

      慎重使用临时表可以极大的提高系统性能。

      关于SQL性能优化的知识就介绍到这里了,希望本次的介绍能够带给您一些收获,谢谢!

    22/2<12
    精选软件测试好文,快来阅读吧~

    精彩评论

    • wby
      2011-8-03 10:55:46

      7、对Where 语句的法则
      这个说法是有误的,希望楼主多看这方面的书

    • zhoudy
      2011-8-03 10:38:35

      好文

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号