设计开发时慎重决定列是否为空(二)
案例2NOT IN的典型查询中NULL值会限制unnest转换,导致优化器无法选择ANTI算法,而走了低效的filter。(11g中,二者选择的执行计划是一样的)点击(此处)折叠或打开DROP TABLE t1;CREATE TABLE t...
设计开发时慎重决定列是否为空
大家在进行表结构设计时,对于表的字段是否为空比较随意,这是错误的。例如,允许id1和id2列为空的情况下,比较条件id1 = id2就应该转换为nvl(id1, 0) = nvl(id2, 0)案例1点击(此处)折叠或打开DROP TABLE t;CREATE TABLE t AS SEL...
IF的顺序有讲究
即便IF逻辑是平行的,也可以根据调用PL/SQL过程函数的IN参数值的分布情况来决定IF的顺序。IN参越是频繁调用的值,对应的IF逻辑就越需要靠前,因为Oracle对IF的调用是靠前的调用执行的更快速。因为条件靠前可以减少判断的次数,也就不会再尝试后面的表达式。点击(此处)折叠或打开...
避免数据类型转换
在SQL语句中如果发生了类型转换,则可能导致索引无法使用。即便和索引无关,但数据类型转换需要的开销也将影响性能。案例1点击(此处)折叠或打开SET timing ON DECLARE j PLS_INTEGER := 0;BEGIN FOR i ...
使用pls_integer类型
比较进行1000000次计算,使用NUMBER和PLS_INTEGER在时间上的差别。点击(此处)折叠或打开SET timing ON DECLARE j NUMBER :=0;BEGIN FOR i IN 1..1000000 LOOP  ...
避免不必要的排序(二)
案例2确认可以使用union all取代union,从而可以避免排序操作。 案例3点击(此处)折叠或打开DROP TABLE t;CREATE TABLE t AS SELECT * FROM dba_objects;CREATE INDEX idx_t ON t(owner, object_id);...
避免不必要的排序(一)
排序是一种耗费资源的操作,因此要尽量避免不必要的排序操作。在不可避免的排序的情况下,也可以利用索引本身的有序性和ORDER BY子句来避免开销。案例1点击(此处)折叠或打开BEGIN FOR i IN (SELECT * FROM t1 ORDER BY ID) LOOP &nbs...
尽量用简单的SQL替代PL/SQL逻辑
可以将很多复杂的结果集先用WITH的别名定义起来,方便后续调用。点击(此处)折叠或打开drop table t;drop table t1;drop table t2;drop table t3;CREATE TABLE t AS SELECT object_id, object_name FROM dba_objects;CREA...
避免SQL中的函数调用
在SQL编码中,尽量避免在SQL中进行函数调用,否则会产生大量的递归调用而影响性能。如果用表连接来代替函数调用,往往会更高效。点击(此处)折叠或打开DROP TABLE people;DROP TABLE sex;CREATE TABLE people (first_name VARCHAR2(200), last_name VARCHAR2(...
设法减少表扫描次数(luise)
点击(此处)折叠或打开--场景: SQL语句非常复杂,涉及dcc_ne_log和dcc_sys_log两张表. 表中记录分别为305 473, 5 037 050-- 目前的执行时间为300秒.SELECT DISTINCT ne_state.peer_id AS peer_name, to_char(ne_state.ne_state) AS peer_state,...
避免对mod函数的调用
mod函数和sysdate函数类似,都为系统函数,mod函数性能极差。实际中应用mod函数的地方比较多,比如指定每多少条记录进行一次批量提交。点击(此处)折叠或打开SET timing ON BEGIN FOR i IN 1..1000000 LOOP &n...
减少对sysdate的调用(二)
案例2sysdate函数调用,改写为赋值。点击(此处)折叠或打开SET timing ONDECLARE v_current_time DATE;BEGIN FOR i IN 1..1000000 LOOP v_...
减少对sysdate的调用(一)
sysdate函数在开发中被大量使用,但它毕竟是函数,如果频繁调用必须对系统产生影响。案例1sysdate函数调用,外面还套有trunc函数,改写为赋值。点击(此处)折叠或打开SET timing ONDECLARE v_current_time DATE;BEGIN &...
OLTP系统中尽量使用绑定变量
在OLAP系统中不宜使用绑定变量,但如果是OLTP系统,就要尽量考虑使用绑定变量。因为OLTP系统的特点是SQL执行非常频繁,并且用时非常短。此时,重用shared pool中的执行计划,减少硬解析所节省的时间就非常可观了。点击(此处)折叠或打开DROP TABLE t;CREATE TABLE t(co...
避免动态SQL(二)
案例2说明如何在特定的情况下,将动态SQL修改为静态SQL。点击(此处)折叠或打开CREATE OR REPLACE PROCEDURE proc1(p_cname VARCHAR2, p_empno NUMBER) IS v_value VARCHAR2(100);BEGIN --使用动态SQL...
避免动态SQL(一)
动态SQL在执行过程中编译,而普通SQL是在执行前就已经编译过了。案例1点击(此处)折叠或打开--create.sql--创建Luise用户和相应的优化脚本包conn / as sysdba;drop user luise cascade;CREATE USER luise IDENTIFIED BY ...
触发器尽量考虑内部代码过程的封装(在11g中没有差别)
点击(此处)折叠或打开--触发器执行的代码尽量考虑使用存储过程进行封装DROP TABLE t1;DROP TABLE t2;CREATE TABLE t1 AS SELECT ename, empno, deptno FROM scott.emp;CREATE TABLE t2 AS SELECT deptno, count(*) as cnt FROM t1 grou...
标量子查询(二)
标量子查询要避免单行子查询返回多行点击(此处)折叠或打开DROP TABLE t1;DROP TABLE t2;CREATE TABLE t1(ID NUMBER, VALUE VARCHAR2(20));CREATE TABLE t2(ID NUMBER, VALUE VARCHAR2(20));INSERT INTO t1 VALUES (1, \'A\');...
标量子查询(一)
标量子查询只和外连接语句等价点击(此处)折叠或打开--下面的语句是否等价?SELECT t1.ID, t2.ID FROM t1, t2 WHERE t1.ID = t2.ID;SELECT t1.ID, (SELECT t2.ID FROM t2 WHERE ID = t1.ID) FROM t1;--构造环境,进行验证DR...
函数索引陷阱
点击(此处)折叠或打开--自定义函数使用函数索引要注意函数代码改变后的影响。 DROP TABLE t;CREATE TABLE t ( x NUMBER, y VARCHAR2(30));INSERT INTO t SELECT ROWNUM, ROWNUM || \'a\' FROM dual CONNECT BY ROWNUM < 1000;...