159.Oracle数据库SQL开发之 SQL优化——若干

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50186029

SQL的主要功能之一时不需要确切地告诉数据库如何获得请求的数据。只需要一个查询,指定想要的信息,然后数据库就会找到最好的方法获得它。有时候可以通过优化SQL语句改进性能。

1.  使用WHERE子句过滤行

有时候想要检索一行时,却会检索表中的所有行,非常浪费的。可以使用WHERE子句。

获取全部行命令如下: select * from customers;

改成:select * from customers where customer_id in (1,2);

2.  使用表连接而不是多个查询

从多个相关表中检索数据时,应该使用连接条件而不应该使用多个查询。

例如两个:

Select name,product_type_id from productswhere product_id=1;

Select name from product_types whereproduct_type_id=1;

使用表连接如下:

Select p.name,pt.name from productsp,product_types pt where p.product_type_id = pt.product_type_id andp.product_id = 1;

结果一样。但是执行一个查询通常比执行两个查询效率更高。

查询中必须选择连接顺序,将行较少的表连接到后面。

查询中应该避免连接复制的视图,因为这样会导致查询中首先执行的是视图,然后才是实际查询。

3.  执行连接时使用完全限定的列引用

在查询中包含表别名,并在查询中使用每列的别名(称为完全限定的列引用)。这样数据库不需要搜索查询所使用的表的每一列。

BAD如下:

Select p.name,pt.name,description,pricefrom products p,product_types pt where p.product_type_id=pt.product_type_id andp.product_id=1;

数据库必须搜索products和product_types两个表来获得description和price列。

改成如下:

Select p.name,pt.name,p.description,p.pricefrom products p,product_types pt where p.product_type_id = pt.product_type_idand p.product_id=1;

4.  使用CASE表达式而不是多个查询

当需要对一个表的相同行执行许多计算时,使用CASE表达式而不是多个查询。

如下3个查询:

Select count(*)from products where price < 13;

Select count(*)from products where price between 13 and 15;

Select count(*)from products where price > 15;

可以优化使用CASE表达式编写一个查询,如下:

Select

COUNT(CASE WHEN PRICE < 13 then 1else null end) low,

Count( case when price between 13 and15 then 1 else null end ) med,

Count(case when price > 15 then 1else null end) high

From products;

5.  添加表索引

从一个包含许多行的表中检索少数行时,只需要为一列建立一个索引。

一条成功经验是:

当当个查询检索的行数小于等于表总行数的10%时,建立索引是有用的。

位图索引一般用于数据仓库,数据仓库是包含大量数据的数据库。

6.  使用WHERE而不是HAVING

WHERE子句用于过滤行;HAVING子句用于过滤行组。因为行被分组之后HAVING才可以过滤行组,所以应该尽量使用WHERE子句过滤行。

较差的如下:

Select product_type_id,avg(price) fromproducts group by product_type_id having product_type_id in ( 1,2);

将WHERE而不是HAVING,执行如下:

SELECT product_type_id,avg(price) fromproducts where product_type_id in ( 1,2) group by product_type_id;

7.  使用UNION ALL而不是UNION

UNION ALL用于获得两个查询检索到的所有行,包括重复行。UNION用于获得查询检索到的所有不重复的行。因为UNION要删除重复行(需要一定时间),所以尽量使用UNION ALL。

8.  使用EXISTS而不是IN

IN用于检查一个值是否包含在列表中。EXIST用于检查子查询返回行的存在性。EXIST只检查行的存在性,而IN检查实际的值。在子查询中,EXISTS提供的性能通常比IN提供的性能要好。因此,应该尽量使用EXISTS而不是IN。

9.  使用EXISTS而不是DISTINCT

DISTINCT用于禁止重复行的显示;EXISTS用于检查子查询返回行的存在性。

应该使用EXISTS而不是DISTINCT,因为DISTINCT在排除重复行之前要对检索到的行排序。

10.        使用GROUPING SETS而不是CUBE

GROUPING SETS提供的性能通常比CUBE提供的性能更好。尽量使用GROUPINGSETS而不是CUBE。

159.Oracle数据库SQL开发之 SQL优化——若干相关推荐

  1. 163.Oracle数据库SQL开发之 SQL优化——优化工具

    163.Oracle数据库SQL开发之 SQL优化--优化工具 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50186075 ...

  2. 2.Oracle数据库SQL开发之 SQL DEVELOPER使用

    2.Oracle数据库SQL开发之 SQL DEVELOPER使用 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/4908221 ...

  3. 29 Oracle数据库SQL开发之 SQLPlus使用——创建简单报表

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 29.O ...

  4. 116.Oracle数据库SQL开发之 PLSQL编程——游标

    116.Oracle数据库SQL开发之 PLSQL编程--游标 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50086931 ...

  5. Oracle数据库使用Analyze提升sql性能

    Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...

  6. 把Oracle数据库移植到Microsoft SQL Server 7 0

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 把Ora ...

  7. Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份

    一  Oracle数据库查看表空间sql语句 1.oracle查看表空间当前用户 SQL>  select  username,default_tablespace  from user_use ...

  8. navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...

    使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中 发布时间:2018-08-20 14:41, 浏览次数:471 , 标签: Navicat pre ...

  9. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...

    远程连接Oracle数据库的配置文件及sql语句 近期,应朋友的要求,用C#语言开发了一个winform应用程序,要求的是连接到远程的Oracle数据库,用惯了SQL Server的我突然有点懵,然后 ...

  10. oracle数据库等级,[数据库]Oracle数据库建表并用SQL编程分等级

    [数据库]Oracle数据库建表并用SQL编程分等级 0 2016-06-15 23:00:13 --创建学生表 create table XS_543 ( XH char(6) not null , ...

最新文章

  1. Nginx 配置清单(一篇够用)
  2. Angular CDK Overlay 弹出覆盖物
  3. 深入Android 【六】 —— 界面构造
  4. linux dev urandom,Linux random vs urandom 区别
  5. 坐标系转换工具_借助工具实现不同坐标系之间的转换
  6. visio 导出无边距的pdf 图
  7. 为什么软件工程师找不到工作?我想分享四个“恐怖故事”
  8. 您应该对什么进行单元测试? –测试技术3
  9. hihocoder offer收割编程练习赛8 B 拆字游戏
  10. Java + selenium 元素定位(3)之By TagName
  11. cad管线交叉怎么画_CAD命令:打断(BREAK)命令的使用技巧
  12. 【DVRP】基于matlab蚁群算法求解带距离的VRP问题【含Matlab源码 1040期】
  13. OpenCV-图像处理(29、凸包-Convex Hull)
  14. Houdini地形与流体解算(模拟泥石流)
  15. 大数据分析流程步骤都有哪些
  16. 【JAVA SE基础篇】30.抽象与接口
  17. 准备半年,面试2个月,上岸快手拿个35K应该不算高吧?
  18. redis实现坐标附近查询
  19. 学渣的刷题之旅 leetcode刷题 20.有效的括号
  20. 番茄花园系统剖析 下

热门文章

  1. cecore.cls.php 08cms,精仿某房产网整站 v1.1
  2. stc 串口收发 c语言,STC15W408AS串口通讯PC乱码
  3. 计算机硬盘与格式化,电脑硬盘能格式化吗
  4. linux amd64目录,创建基于amd64的qqforlinux的deb包
  5. 锐起无盘服务器缓存多少,锐起无盘缓存分析
  6. Android 11 开机动画资源
  7. 【MySQL】数据库基础知识
  8. 数据结构严蔚敏4.7习题2应用题(1)
  9. 使用wps插件,实现word转PDF
  10. 实践与交流:采取“硬刷”方式完美激活Windows 7旗舰版的具体方法步骤(图文详解教程)...