SQL Best Practices
1.用EXISTS代替DISTINCT,消除sort operation,例如:
SELECT DISTINCT d.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
可以使用EXISTS形式代替
SELECT d.deptno, d.dname
FROM dept d
WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno);
2.如果在GROUP BY中过滤数据,在WHERE从句中指定条件比在HAVING从句中有更好的性能,因为在GROUP之前已经过滤掉数据,因此更少的行被汇总
3.UNION会对两个SELECT语句的结果集执行一个SORT,并消除重复行,成本会昂贵,而UNION ALL则不会。因此如果应用能够处理重复,或者确信没有重复记录,那么考虑使用UNION ALL代替UNION
4.能不用UNION就不要用它,例如可以如果可以的话使用OR代替UNION。例如查询职位为销售人员,或者薪水大于等于3000的人员信息
SELECT *
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.job = 'SALESMAN'
UNION ALL
SELECT *
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.sal >= 3000;
应该使用OR代替
SELECT *
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND (e.job = 'SALESMAN' OR e.sal > = 3000);
5.为了避免在一个SQL语句中混合使用LEFT JOIN和RIGHT JOIN产生混淆,应该使用一个一致的视野,例如外连接只使用FULL or LEFT OUTER JOIN,忽略掉RIGHT OUTER JOIN
例如:
SELECT e.lname, j.function, d.name
FROM job j LEFT OUTER JOIN employee e ON e.job_id = j.job_id
RIGHT OUTER JOIN department d ON e.dept_id = d.dept_id;
应该转换为:
SELECT e.lname, j.function, d.name
FROM department d LEFT OUTER JOIN
(job j LEFT OUTER JOIN employee e
ON e.job_id = j.job_id)
ON e.dept_id = d.dept_id;
6.SQL被Oracle执行之前需要被解析。无论一个给定的SQL语句被执行多少次,它仅仅需要一次解析。在解析期间,下面的步骤被执行(不考虑顺序):
(1)SQL语句语法被验证
(2)数据字典被搜索用以验证表和列的定义
(3)数据字典被搜索用以验证在相关对象上的安全权限
(4)相关对象上会获得解析锁
(5)决定最佳的执行计划
(6)语句被加载到SGA系统全局区中的共享池内的共享SQL区(也叫library cache库高速缓存区)。这个执行计划和解析信息被保存在这里,以防止相同的语句被再次执行
一条SQL语句被解析的条件是,仅仅如果Oracle不能在SGA的共享SQL区中找到同样的SQL语句。
在解析一条SQL语句之前,Oracle在库高速缓存中搜索相同的SQL语句。如果找到了确切的匹配,则不再需要解析这条语句。然而如果相同的SQL语句没有被找到,那么Oracle会执行上面所述的步骤去解析这条语句。
为了成为相同的SQL语句,必须满足下述条件:
(1)有相同的大小写字符
(2)有相同的空格和换行
(3)使用相同的名字引用相同的对象,必须有相同的owner所有者
如果应用可能多次执行相同的或相似的SQL语句,尽一切办法尝试避免不必要的解析。这样将会提高应用的所有性能。减少SQL解析的两种技术:
(1)使用绑定变量
(2)使用表别名
6.1使用绑定变量
当多用户使用一个应用的时候,会经常反复的执行相同的SQL语句集合,但是会使用不同的数值。例如,一个客户代表经常执行下面语句:
SELECT * FROM customer WHERE cust_nbr = 121;
而另一个客户代表将会执行:
SELECT * FROM customer WHERE cust_nbr = 328;
这两条SQL语句相似,但是不相同,因为cust_nbr的号不同,因此Oracle必须解析两次。可以使用绑定变量重写应用。这样的话,有问题的SQL语句可以改写为:
SELECT * FROM customer WHERE cust_nbr = :x;
Oracle仅仅需要解析一次语句了。多用户并发执行的程序在同时提供不同的cust_nbr的时候,能够共享这条SQL语句相同的拷贝,减少不必要的解析。
6.2使用表别名
表别名的使用能够帮助提升SQL语句的性能,提供了方便的简化符号,使查询语句更可读,更简明,表别名的长度最大能到30个字符。
容易犯的错误是在写hint的时候忘记使用表别名,这样的话这些hint将被静态忽略掉。
一旦定义了别名,在查询语句的任何地方以及任何的hint都必须指定别名,而不是真实的表名。
这里阐述使用表别名如何影响性能,如下查询:
SELECT c.cust_nbr, name, order_nbr
FROM customer c, cust_order o
WHERE c.cust_nbr = o.cust_nbr;
因为name列只在customer表中有,order_nbr列只在cust_order表中存在,所以可以不用别名限定列,这句sql是有效的。但是如果查询没有限定列,那么当解析这个语句时,需要找到这些列属于哪个表,Oracle必须搜索customer和cust_order这两个表。对于一个查询来说,这个搜索所需要的时间可能是可以忽略不计的,但是如果你有许多这样的查询要解析的话,那么加起来就会很耗资源。在一个查询中,使用表别名限定所有的列(甚至那些明确的列)是好的编程实践。这样的好处是,在解析语句的时候,Oracle能够避免这种额外的搜索。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
相关推荐
#### 八、Oracle SQL最佳实践 为了确保Oracle SQL查询的有效性和性能,开发人员应该遵循以下最佳实践: - **避免使用SELECT ***:尽量指定所需的列名,而不是使用`SELECT *`。 - **使用适当的索引**:合理设计和使用...
Oracle SQL编程最佳实践是IT行业中处理关系型数据库的专业指南,尤其针对Oracle数据库系统。在当今的数据驱动世界中,关系型数据库的使用非常广泛,因此掌握其编程最佳实践显得尤为重要。接下来将详细讲解关系型与非...
本篇将深入探讨Oracle PL/SQL的最佳实践,旨在帮助您提升代码质量、性能和可维护性。 1. **模块化编程**:将复杂的业务逻辑拆分成小型、可重用的存储过程和函数,有助于提高代码的清晰度和可读性。使用包(PACKAGE...
#### 六、Oracle SQL 最佳实践 - **规范化设计**:通过将数据组织成多个相互关联的表,减少数据冗余和提高数据一致性。 - **索引优化**:合理创建索引来加快查询速度,同时注意维护索引的成本。 - **批处理操作**:...
Oracle PLSQL最佳实践第二版是一本专为数据库管理员和开发者设计的指南,旨在提供关于如何高效、稳定且安全地使用Oracle PL/SQL编程语言的深入见解。PL/SQL是Oracle数据库系统中的一个强大力量,它允许用户创建复杂...
"Oracle运维最佳实践-下"很可能是一本深入探讨Oracle数据库运维的专业资料,书中可能包含了运维工程师在日常工作中所需的重要技能和经验分享。下面,我们将根据这个主题,对Oracle运维的一些关键知识点进行详细的...
本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL的核心概念、语法和最佳实践。 1. **PL/SQL语言参考**:PL/SQL是Oracle特有的过程化语言,它结合了SQL的查询能力与编程语言的控制结构。此文档详细介绍了PL/...
"Oracle运维最佳实践"系列文档,旨在为数据库管理员(DBA)提供一套完整的运维策略和技巧,确保Oracle系统的高效运行和数据安全。 一、Oracle数据库体系结构 Oracle数据库由多个组件组成,包括实例、数据库、表空间、...
### Oracle RAC最佳实践知识点详解 #### 一、会话级别的动态性能统计 在Oracle RAC环境中,了解各个会话的动态性能对于诊断性能瓶颈至关重要。以下是一些关键的视图和查询,可以帮助我们深入了解会话级别的性能: ...
### Oracle ASM 最佳实践 #### 引言 在Oracle Database 10g Release 2中,通过使用自动存储管理(ASM)极大地简化了数据库的存储管理和配置任务。ASM提供了内置到Oracle数据库内核中的文件系统和卷管理功能,从而...
通过以上内容的学习,读者不仅可以掌握Oracle SQL的基本操作,还能深入了解其高级特性和最佳实践,为解决实际工作中的复杂问题打下坚实的基础。无论是初学者还是有经验的数据库管理员,《精通Oracle SQL 第2版》都是...
Oracle.PL.SQL最佳实践
### Oracle SQL*Plus 口袋...以上章节覆盖了《Oracle SQL*Plus Pocket Reference, 2nd Edition》的主要内容,为读者提供了丰富的SQL*Plus使用技巧和最佳实践,适合各种级别的Oracle数据库管理员和技术人员学习和参考。
这本书更新至覆盖Oracle 10g版本,专注于实用的、专家级的最佳实践和Oracle特有的SQL技术,旨在帮助读者挖掘并利用Oracle SQL未被充分利用(甚至常常被忽视)的强大功能。 ### 为什么撰写这本书? 作者在前言中...
在Oracle数据库管理中,SQL调优是提升系统...以上知识点只是"Oracle SQL Tuning"的冰山一角,实际调优过程中还需要结合具体环境和业务需求进行深入分析和实践。Oracle SQL优化是一个持续的过程,需要不断学习和调整。
《Pro Oracle SQL Development》这本书是Oracle SQL开发的专业指南,它深入探讨了Oracle数据库系统中的SQL语言使用和优化...这本书不仅覆盖了理论知识,还提供了大量实例和最佳实践,帮助读者将所学应用于实际开发中。
书中不仅包含了基础的SQL语法,还涵盖了高级特性和最佳实践,是Oracle DBA、开发人员和数据分析师的重要参考资料。 1. **SQL基础知识**:本书首先介绍了SQL的基本概念,包括数据定义(DDL)、数据操纵(DML)和数据...
8. 持续学习:数据库技术和标准在不断演变,持续学习Oracle的新特性和最佳实践对于保持专业技能的竞争力至关重要。 以上是对Oracle SQL入门和实战可能涉及知识点的概述。由于正文中没有提供具体的内容,无法提供更...