Oracle SQL优化小结

1.执行多表关联查询时,使用完全限定的列引用

不推荐:SELECT description, price FROM products p, product_types pt WHERE p.id = pt.id;

推荐:SELECT p.description, pt.price FROM products p, product_types pt WHERE p.id = pt.id;

原因:减少数据库搜索description, price位于哪张表中的开销。

 

2.使用WHERE而不是HAVING

不推荐:SELECT id, avg(price) FROM products GROUP BY id HAVING id IN (1, 2);

推荐:SELECT id, avg(price) FROM products WHERE id IN (1, 2) GROUP BY id;

原因:having在group之后执行,而where在group之前,后者筛选范围大大减小。

 

3.使用EXISTS而不是IN

不推荐:SELECT id, name FROM products WHERE id IN (SELECT id FROM purchases)

推荐:SELECT id, name FROM products pt WHERE EXISTS (SELECT 1 FROM purchases p WHERE pt.id = p.id)

原因:EXISTS只检查行是否存在,而IN检查实际值。

 

4.使用EXISTS而不是DISTINCT

不推荐:SELECT DISTINCT pr.id, pr.name FROM products pr, purchase pu WHERE pr.id = pu.id

推荐:SELECT id, name FROM products pr WHERE EXISTS (SELECT 1 FROM purchases pu WHERE pr.id = pu.id)

原因:EXISTS只检查行是否存在,DISTINCT在排除重复行前要对检索的行排序。

 

选摘自《Oracle Database 11g SQL开发指南》 Jason Price

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值