1.使用where子句过滤行
这个是最最基础的优化了。where子句中应该避免使用函数,否则会增加执行时间。
SELECT * FROM USER;
SELECT * FROM USER WHERE USER_ID = 10000;
2.使用表连接而不是多个查询
通常执行一个查询的效率会比执行两个查询的效率高。查询中应避免复杂的视图,因为这样会导致查询中首先执行的是视图,然后才是实际查询。相反地,使用表而不是试图编写查询。
SELECT USER_ID FROM USER WHERE USER_TYPE = 2;
==> 1
SELECT TEACHER_ID FROM TEACHER WHERE USER_ID = 1;
SELECT T.TEACHER_ID FROM TEACHER T,USER U WHERE U.USER_TYPE = 2 AND T.USER_ID = U.USER_ID;
3.执行连接时使用完全限定列引用
在查询中包含表别名,并为查询所引用的每列显式指定合适的别名。因为对列的所有引用包含了表别名,数据库不需要浪费时间去搜索所有表,从而减少了执行时间。
SELECT U.USER_ID,TEACHER_ID FROM TEACHER T,USER U WHERE T.USER_ID = U.USER_ID;
SELECT U.USER_ID,T.TEACHER_ID FROM TEACHER T,USER U WHERE T.USER_ID = U.USER_ID;
4使用case查询而不是多个查询
当需要对一个表的相同行执行许多计算时使用CASE表达式而不是多个查询。
SELECT COUNT(*) FROM USER WHERE AGE < 10;
==>30
SELECT COUNT(*) FROM USER WHERE AGE BETWEEN 10 AND 13;
==>20
SELECT COUNT(*) FROM USER WHERE AGE > 13;
==>10
SELECT
COUNT(CASE WHEN AGE < 10 THEN 1 ELSE NULL END) LOW,
COUNT(CASE WHEN AGE BETWEEN 10 AND 13 THEN 1 ELSE NULL END) MID,
COUNT(CASE WHERN WHERE AGE > 13 THEN 1 ELSE NULL) HIGH
FROM USER;
CASE表达式中可以使用重叠的范围和不同的函数。
5.添加表索引
索引的缺点是当向表中添加一行时,需要附加时间来更改新行的索引。一般地,一个包含许多行的表检索少数行时,只需要为一列建立一个索引。一条成功的经验是,当单个查询检索的行数不大于表总行数的10%时,建立索引是有用的。
6.使用WHERE而不是HAVING
WHERE子句用户过滤行;HAVING子句用于过滤行组。因为行被分组之后,HAVING才可以过滤行组,这需要一定的时间,所以应该经尽量使用WHERE子句过滤行。
SELECT PRODUCT_TYPE_ID,AVG(PRICE) FROM PRODUCTS GOURP BY PRODUCT_TYPE_ID HAVING PRODUCT_TYPE_ID IN (1,2);
SELECT PRODUCT_TYPE_ID,AVG(PRICE) FROM PRODUCTS WHERE PRODUCT_TYPE IN (1,2) GROUP BY PRODUCT_TYPE_ID;
7.使用UNION ALL而不是UNION
UNION ALL用于获得两个查询检索到的所有行,包括重复行;UNION用于获得查询检索到的所有不重复行。应为UNION删除了重复行,这需要一定时间,所以尽量使用UNION ALL
SELECT PRODUCT_ID,PRODUCT_TYPE_ID,NAME FROM PRODUCTS UNION SELECT PRD_ID,PRD_TYPE_ID,NAME FORM MORE_PRODUCTS;
SELECT PRODUCT_ID,PRODUCT_TYPE_ID,NAME FROM PRODUCTS UNION ALL SELECT PRD_ID,PRD_TYPE_ID,NAME FROM MORE+PRODUCTS;
8.使用EXISTS而不是IN
IN用于检查一个值是否包含在列表中。EXISTS与IN不同:EXISTS只检查行的存在性,而IN检查实际的值。在子查询中,EXISTS提供的性能通常比IN提供的性能要好。
9.使用EXISTS而不是DISTINCT
DISTINCT用于禁止重复行的现实;EXISTS用于检查子查询返回的行的存在性。因为DISTINCT在禁止重复行之前要排序检索到的行。
分享到:
相关推荐
以下是对SQL优化的总结,主要聚焦于Oracle数据库的SQL语句调优。 1. **理解执行计划**:优化SQL的第一步是理解查询的执行计划。Oracle的`EXPLAIN PLAN`可以展示SQL执行的步骤,包括表扫描方式、连接顺序、索引使用...
接下来,"数据库SQL优化总结之百万级数据库优化.pdf"可能深入到实际的优化实践。 1. **数据库架构设计**:在百万级数据量下,合理的设计能避免性能瓶颈,如垂直分割、水平分割,以及读写分离策略。 2. **缓存与...
SQL优化总结.xmind
SQL语句优化是一项重要的数据库管理技能,能够显著提高数据库查询性能,减少资源消耗,缩短响应时间。以下是对上述文件内容中提及的关键知识点的详细总结: 1. 选择最有效的表名顺序 在使用基于规则的优化器时,...
Oracle数据库SQL优化是一个关键的技能,对于提升数据库性能和应用响应速度至关重要。以下是一些针对非DBA的Oracle SQL优化技巧: 1. **选择最有效的表名顺序**:在FROM子句中,应将记录最少的表放在最前面,基础表...
SQL语句操作,消耗了70%~90%的数据库资源; 独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;
### SQL优化经验总结34条 #### 一、选择最有效率的表名顺序 - **要点**: 在基于规则的优化器(RBO)中,Oracle解析器从右至左处理FROM子句中的表名。为了提高性能,应将记录条数最少的表放在最后,即作为基础表。...
SQL优化是数据库性能提升的关键环节,它涉及到查询速度、资源消耗和系统稳定性等多个方面。以下是一些关于SQL优化的关键知识点: 1. **索引优化**: - 索引的合理使用至关重要,应确保主要的查询条件字段都有索引...
sql优化总结,对sql 优化在实战中对于sql优化的浅显理解,大神勿喷。
通过阅读"sql优化经验总结V1.5.ppt"和"sql优化经验总结.ppt",可以更深入地学习到更多实用技巧和案例分析,进一步提升在Oracle SQL优化方面的能力。不断学习和实践,才能在这个领域取得更大的成就。
数据库SQL优化大总结之百万级数据库优化方案 本文总结了数据库SQL优化的十一个重要知识点,以帮助开发者提高SQL查询效率,避免全表扫描。 一、数据库SQL优化之索引优化 1. 在where及order by涉及的列上建立索引,...
### SQL优化经验总结34条深度解读 #### (1) 最优表名顺序:提升查询效率 在基于规则的优化器中,Oracle按照从右至左的顺序处理FROM子句中的表名。为了提高查询效率,应将记录条数最少的表置于FROM子句的最后,作为...
16.4.2 优化总结 445 16.5 本章习题、总结与延伸 446 第17章 总结与延伸:从勿信讹传到洞若观火 447 17.1 SQL优化的各个误区 447 17.1.1 COUNT(*)与COUNT(列)的传言 447 17.1.2 谈SQL编写顺序之流言蜚语 451 ...
这篇博客"通过分析SQL语句的执行计划优化SQL(总结)"深入探讨了这一主题,下面将对其中的主要知识点进行详细阐述。 1. **执行计划的理解**: 执行计划是数据库管理系统在执行SQL语句之前预先生成的一种详细步骤,它...
- **全书总结**:本书不仅是一本关于SQL优化的技术书籍,更是引导读者进入SQL优化世界的指南。通过丰富的案例、实战经验和深入的技术探讨,帮助读者建立起从宏观到微观的优化思路,并最终达到“爽”的境界。 - **...