orcle:sql优化

查询时将行较少的表连接到后面

 

 连接是使用完全限定的列引用

多表连接的时候,为表创建别名,或者不创建,select语句指定属性在哪个列比不指定要好,不指定的话数据库需要搜索全部的表来获得列,即

SELECT p1.col_name , p2.col_name
FROM table_name p1, table_name p2
WHERE expr1;

 

两个 列都有指定在哪个表。

 

添加表索引

 数据库索引用于查找表的特定行。索引的确定是当向表添加一行时,需要附加时间来更新新行的索引。

oracle 数据库自动为表的主键和包含在唯一约束中(UNIQUE)的列创建索引。

而在执行分级查询(包含 CONNECT BY 的查询),应该为 START WITH 和 CONNECT BY  子句所引用的列添加索引。

http://www.cnblogs.com/Azhu/archive/2012/04/03/2431132.html 有一些 CONNECT BY  的分级查询用法。

 

使用 WHERE 而不是HAVING

 WHERE 子句用于过滤行,HAVING 子句用于过滤行组。

--BAD
SELECT *
FROM table_name
GROUP BY column_name
HAVING column_name IN ('1','2');
--GOOD
SELECT*
FROM table_name
WHERE column_name IN ('1','2')
GROUP BY column_Name;

 

 这两个语句结果是一样的。

但是下面的语句明显好很多。

 

使用EXISTS 而不是 IN

IN 用于检查一个值是否包含在列表中。

EXISTS只检查行的存在性,而 IN 检查实际的值。

eg: 查找一个在表一中的数据是否在表二中,如果是输出,

生活例子:从商品表中查找已经被购买了的商品

--BAD
SELECT *
FROM table_name1
WHERE column_name IN
( SELECT column_name
  FROM table_name2)
;

 

--GOOD
SELECT*
FROM table_name1 outer
WHERE EXISTS
  (SELECT 1
  FROM table_name2 inner
  WHERE outer.column_name = inner.column_name)
;

 

 

使用EXISTS 而不是DISTINCT

DINSTINCT用于禁止重复行的显示

这种情况是基于外表,就是数据来源的表没有重复行,内表用重复行的情况,用上面的例子

eg: 查找一个在表一中的数据是否在表二中,如果是输出,表一不会有重复的数据,表二会有重复的数据

生活例子:从商品表中查找已经被购买了的商品,这样商品列表唯一,但是购买商品是从客户那收集,会有商品被重复购买

 

--BAD
SELECT DISTINCT t1.column_name
FROM table_name1 t1, table_name2 t2
WHERE t1.column_name = t2.column_name;
--GOOD
SELECT column_name
FROM table_name1 outer
WHERE EXISTS
  (SELECT 1
  FROM table_name2 inner
  WHERE inner.column_name = outer.column_name)
;

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/Azhu/archive/2012/04/17/2454206.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值