`

Oracle中的高效语句

阅读更多

1、Where子句中的连接顺序:
ORACLE采用自下而上的顺序解析WHERE子句。
根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

举例:
(低效)
select ... from table1 t1 where t1.sal > 300 and t1.jobtype = '0001' and 20 < (select count(*) from table1 t2 where t2.pno = t1.tno;

(高效)
select ... from table1 t1 where 20 < (select count(*) from table1 t2 where t2.pno = t1.tno and t1.sal > 300 and t1.jobtype = '0001';

2、Select子句中避免使用 “ * ”:
当你想在select子句中列出所有的column时,使用动态SQL列引用 ‘*' 是一个方便的方法。
不幸的是,这是一个非常低效的方法。
实际上,ORACLE在解析的过程中,会将 '*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。


3、减少访问数据库的次数:
当执行每条SQL语句时,ORACLE在内部执行了许多工作:
解析SQL语句、估算索引的利用率、绑定变量、读数据块等等。
由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。

举例:
题目——我要查找编号为0001、0002学生的信息。
(低效)
select name,age,gender,address from t_student where id = '0001';
select name,age,gender,address from t_student where id = '0002';
(高效)
select a.name,a.age,a.gender,a.address,b.name,b.age,b.gender,b.address from t_student a,t_student b where a.id = '0001' and b.id = '0002';

4、使用Decode函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

举例:
(低效)
select count(*), sum(banace) from table1 where dept_id = '0001' and name like 'anger%';
select count(*), sum(banace) from table1 where dept_id = '0002' and name like 'anger%';
(高效)
select  count(decode(dept_id,'0001','XYZ',null)) count_01,count(decode(dept_id,'0002','XYZ',null)) count_02,
sum(decode(dept_id,'0001',dept_id,null)) sum_01,sum(decode(dept_id,'0002',dept_id,null)) sum_02
  from table1
  where name like 'anger%';

5、整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

举例:
(低效)
select name from table1 where id = '0001';
select name from table2 where id = '0001';
select name from table3 where id = '0001';
(高效)
select t1.name, t2.name, t3.name
    from table1 t1, table2 t2, table3 t3
    where t1.id(+) = '0001' and t2.id(+) = '0001' and t3.id(+) = '0001'
【注:上面例子虽然高效,但是可读性差,需要量情而定啊!】

6、删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)

举例:
delete from table1 t1
  where t1.rowid > (select min(t2.rowid) from table1 t2 where t1.id = t2.id);

7、尽量不要使用having子句,可以考虑用where替换。
having只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作。
如果能通过where子句限制记录的数目,那就能减少这方面的开销。

8、尽量用表的别名:
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。
这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

9、用exists替代in(发现好多程序员不知道这个怎么用):
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。
在这种情况下,使用exists(或not exists)通常将提高查询的效率。

举例:
(低效)
select ... from table1 t1 where t1.id > 10 and pno in (select no from table2 where name like 'www%');
(高效)
select ... from table1 t1 where t1.id > 10 and exists (select 1 from table2 t2 where t1.pno = t2.no and name like 'www%');

10、用not exists替代not in:
在子查询中,not in子句将执行一个内部的排序和合并。
无论在哪种情况下,not in都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。
为了避免使用not in,我们可以把它改写成外连接(Outer Joins)或not exists。


11、用exists替换distinct:
当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct. 一般可以考虑用exists替换

举例:
(低效)
select distinct d.dept_no, d.dept_name from t_dept d, t_emp e where d.dept_no = e.dept_no;
(高效)
select d.dept_no, d.dept_name from t_dept d where exists (select 1 from t_emp where d.dept_no = e.dept_no);

exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

12、用表连接替换exists:
通常来说,采用表连接的方式比exists更有效率。

举例:
(低效)
select ename from emp e where exists (select 1 from dept where dept_no = e.dept_no and dept_cat = 'W');
SELECT ENAME
(高效)
select ename from dept d, emp e where e.dept_no = d.dept_no and dept_cat = 'W';

13、避免在索引列上使用is null和is not null
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。
对于单列索引,如果列包含空值,索引中将不存在此记录;
对于复合索引,如果每个列都为空,索引中同样不存在此记录;
如果至少有一个列不为空,则记录存在于索引中。

举例:
如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null),
ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入),
然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空。
因此你可以插入1000 条具有相同键值的记录,当然它们都是空!
因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。

分享到:
评论

相关推荐

    Oracle高效SQL语句原则

    Oracle 高效 SQL 语句原则 Oracle 高效 SQL 语句原则是指在编写 Oracle 数据库 SQL 语句时需要遵循的一些基本原则,以便提高 SQL 语句的执行效率,减少数据库服务器的负载,提高应用程序的性能。下面是 Oracle 高效...

    Oracle导出INSERT语句

    在数据库管理中,有时我们需要将数据从一个环境迁移到另一个环境,或者备份某些表的数据,这时“Oracle导出INSERT语句”的工具就显得非常实用。 这个小工具的核心功能是将Oracle数据库中的数据转换为一系列的INSERT...

    Oracle中SQL语句执行效率的查找与解决

    本文将深入探讨Oracle中SQL语句执行效率的查找与解决方法,特别关注于如何识别和优化那些导致性能瓶颈的查询。 ### Oracle SQL执行效率:查找与解决 #### 一、资源消耗分析 在Oracle中,SQL语句执行效率低下通常...

    Oracle导出INSERT语句V1.1

    Oracle数据库是世界上最流行的数据库管理系统之一,它广泛应用于各种规模的企业和组织中,用于存储和管理大量结构化数据。...了解如何有效利用这个工具,将有助于我们在Oracle数据库管理中更高效地完成任务。

    oracle高效语句编写知识.doc

    3. **使用相同的绑定变量名称**:如果SQL语句中包含绑定变量,那么这些绑定变量的名称也必须完全一致。 ### 示例分析 假设存在两个用户:Jack和Jill。Jack拥有私有同义词`sal_limit`,而Jill也拥有一个同名的私有...

    压测Oracle的SQL语句的性能情况

    本文将深入探讨如何利用压力测试工具来评估和优化Oracle数据库中的SQL语句性能。 标题"压测Oracle的SQL语句的性能情况"暗示了我们关注的是在高负载情况下,Oracle数据库处理SQL查询的能力。压力测试(Pressure ...

    Oracle Sql高效语句的写法诀窍

    绑定变量是SQL语句中用于代替硬编码的字面值的占位符。它们在SQL语句第一次执行时被赋值,然后存储在数据库的共享池中,供后续相同的查询调用和重用。这避免了每次执行相同SQL语句时的解析过程,因为数据库系统可以...

    Oracle基本sql语句

    在SELECT语句中,我们还可以使用DISTINCT关键字来确保查询结果中不会有重复的行出现。例如: SELECT DISTINCT job_id FROM employees; 这条语句会返回员工表中不重复的job_id列。 为了提高SQL语句的可读性,我们...

    Oracle高效SQL语句原则.txt

    10. **避免在SQL语句中使用过多的字符串操作函数**: - 如`UPPER()`、`SUBSTR()`等函数可能会降低查询性能。 - **建议**:尽可能减少这些函数的使用,或者确保在索引列上进行操作。 11. **优化索引使用**: - ...

    通过xlrd读取excel生成oracle的建表语句

    上述Python脚本生成的建表语句中,所有字段都被定义为VARCHAR2类型,这是Oracle中用于存储变长字符串的类型。在实际应用中,你需要根据数据特性选择更适合的数据类型,如NUMBER(数值)、DATE(日期)、BOOLEAN...

    ORACLE经典常用语句总结

    掌握这些经典的Oracle SQL语句,不仅能帮助数据库管理员有效地管理和优化数据库性能,还能使开发人员在设计和实现数据库应用程序时更加灵活高效。无论是日常维护还是解决复杂问题,这些语句都是必不可少的工具箱。

    ORACLE 优化sql语句提高oracle执行效率 .doc

    ORACLE 优化 SQL 语句提高 Oracle 执行效率 Oracle 是一个功能强大的关系数据库管理系统,然而,如果不正确地使用 SQL 语句,可能会导致执行效率低下。为了提高 Oracle 的执行效率,需要遵循一些最佳实践。下面是...

    Oracle学习查询语句

    Oracle数据库是世界上最流行的数据库管理系统之一,...理解并熟练掌握这些知识点,对于高效地在Oracle数据库中检索和操作数据至关重要。在实际应用中,可以根据具体需求灵活运用这些工具,以实现复杂的数据查询和分析。

    ORACLE的SQL语句脚本

    在IT行业中,Oracle数据库系统是企业级数据管理的首选,其强大的功能和高效的数据处理能力使其在全球范围内广泛应用。本文将深入探讨"ORACLE的SQL语句脚本",特别是涉及的PL/SQL语言,以及如何利用这些脚本来创建表...

    oracle常用sql语句大全 注释完整 放心使用

    本资料集包含了Oracle数据库中常用SQL语句的大全,注释完整,非常适合初学者和有经验的开发者参考使用。 1. **数据查询(SELECT语句)**: - `SELECT * FROM table_name;`:查询表table_name中的所有列。 - `...

    oracle系列教程三+oracle复杂SQL语句.doc

    本文将深入探讨Oracle中的复杂SQL语句,包括查询优化、索引、函数的使用以及如何进行行列转换和去重操作。 首先,了解SQL语句的执行顺序至关重要。在一般的查询中,如`SELECT`、`FROM`、`WHERE`,执行顺序为:先...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...

    oracle常用查询语句示例

    以上就是Oracle中一些常用的查询语句示例,这些技巧可以帮助你在日常的数据分析和管理中更加高效地操作数据。对于更复杂的情况,如视图、存储过程、触发器等,你还需要进一步学习和实践。通过不断探索,你将能够充分...

    oracle sql语句学习

    2. **子查询**:在查询语句中嵌套其他查询,用于获取更复杂的查询结果。 3. **连接(JOIN)**:用于合并多个表的数据,有内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)等。 4. **游标(CURSOR)**...

Global site tag (gtag.js) - Google Analytics