oracle数据库优化与LNNVL函数使用

一:先谈谈数据库的优化

1. max 函数 运行速率慢;现在用下面的方式替换

A;用max函数的方式;获取最新操作时间的 一行员工记录-----------速度慢;

select *
             from [email protected] JER
             WHERE JER.TYPE = ‘员工银行卡信息记录‘
                       AND JER.CREATEDATE = (SELECT MAX(CREATEDATE)
                               FROM [email protected]
                                  WHERE TYPE = ‘员工银行卡信息记录‘
                                   AND EMPLID = JER.EMPLID
                           )

B;不用max函数的方式: ---------------

SELECT *
                  FROM [email protected] jer
                  WHERE jer.type = ‘员工银行卡信息记录‘
                  AND NOT EXISTS (SELECT ‘X‘              //X这里是随意的 可以是任何值   这里的逻辑就是  不存在 比 temp的创建日期大于jer的创建日期;这就是要 jer里的日期是最新的
                       FROM [email protected] temp
                          WHERE temp.type = jer.type
                            AND temp.emplid = jer.emplid
                            AND temp.createdate > jer.createdate)

二 :左连接的新写法

SELECT jer.emplid,
       pn.name,
       to_char(jer.createdate, ‘yyyy-mm-dd‘) createdate,
       pb.account_ec_id,
       ppn.national_id nid
  FROM [email protected] jer,
       sysadm.ps_pye_bankacct pb,
       sysadm.ps_pers_nid ppn,
       (SELECT ps.emplid, ps.name
          FROM sysadm.ps_names ps
         WHERE NOT EXISTS (SELECT ‘X‘
                  FROM sysadm.ps_names ps1
                 WHERE ps1.emplid = ps.emplid
                   AND ps1.effdt > ps.effdt)) pn
 WHERE 1 = 1
   AND jer.emplid = ppn.emplid
   AND jer.emplid = pb.emplid(+)    //左连接
   AND jer.emplid = pn.emplid(+)   //左连接
   AND NOT EXISTS
 (SELECT ‘X‘
          FROM [email protected] temp
         WHERE temp.type = jer.type
           AND temp.emplid = jer.emplid
           AND temp.createdate > jer.createdate)
   AND jer.type = ‘员工银行卡信息记录‘
   AND ppn.national_id_type = ‘NID‘
   AND jer.createdate >= to_date(‘2015-03-01‘, ‘yyyy-mm-dd‘)
   AND jer.createdate <= to_date(‘2015-04-10‘, ‘yyyy-mm-dd‘)
 ORDER BY jer.emplid

三 :LNNVL函数

LNNVL官方解释翻译
    
lnnvl用于某个语句的where子句中的条件,如果条件为true就返回false;如果条件为UNKNOWN或者false就返回true。该函数不能用于复合条件如AND, OR, or BETWEEN中。

几种情况测试说明

--年份小于2009(lnnvl表示年份大于或者2009包含null)

SQL> select * from xifenfei where lnnvl(year<2009);

NAME                       YEAR

-------------------- ----------

xifenfei2008

xifenfei2009               2009

xifenfei2010               2010

xifenfei2011               2011

--year不为null(lnnvl表示年份为null)

SQL> select * from xifenfei where lnnvl(year is not null);

NAME                       YEAR

-------------------- ----------

xifenfei2008

--年份为null(lnnvl表示年份不为null)

SQL> select * from xifenfei where lnnvl(year is  null);

NAME                       YEAR

-------------------- ----------

xifenfei2001               2001

xifenfei2002               2002

xifenfei2003               2003

xifenfei2004               2004

xifenfei2005               2005

xifenfei2006               2006

xifenfei2007               2007

xifenfei2009               2009

xifenfei2010               2010

xifenfei2011               2011

10 rows selected.

--年份为12345(lnnvl表示年份不为12345)

SQL> select * from xifenfei where lnnvl(year =12345);

NAME                       YEAR

-------------------- ----------

xifenfei2001               2001

xifenfei2002               2002

xifenfei2003               2003

xifenfei2004               2004

xifenfei2005               2005

xifenfei2006               2006

xifenfei2007               2007

xifenfei2008

xifenfei2009               2009

xifenfei2010               2010

xifenfei2011               2011

11 rows selected.

--年份不为12345(lnnvl表示年份为12345或者null)

SQL> select * from xifenfei where lnnvl(year !=12345);

NAME                       YEAR

-------------------- ----------

xifenfei2008

时间: 2024-10-10 18:12:04

oracle数据库优化与LNNVL函数使用的相关文章

oracle数据库优化之统计信息

1.统计信息简介 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息.CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划. 在CBO(基于代价的优化器模式)条件下,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式决定执行计划!可以说统计信息关乎sql的执行计划是否正确,

oracle数据库优化

sql性能优化 1. 尽量不要是用*来代替所有字段 2. 大写比小写的性能要高 3. 查询中,where后面多个条件时,过滤掉数据最多的那个条件放在最右边 4. >=与>相比,性能会更高;<=和<类似 5. between...and 其实类似于>=和<=,所以与>,<比较,between...and 的性能会更高 6. 尽量避免对索引进行运算 7. 尽量减少使用函数 8. 尽量避免使用in , any,all,distinct,not..这些关键字 9.

Oracle 数据库优化-分析现有的sql

在做数据库sql优化时,首先要对现有的数据库sql进行优化,主要包括以下几种: 1.数据库正在执行的SQL是? 2.已经执行过得SQL是? 3.最耗时的的前几条SQL是? 4.最耗IO的SQL是? 5.某条SQL执行的计划是?某条SQL上的优化策略是否起作用? 以下,将对上面的几种情况分别陈述. 一.查询正在执行的sql. select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT from v$session a, v$sqlarea b where

Oracle数据库基础--存储过程和函数

一.存储过程和函数 存储过程: 对一个模块的封装 函数: 功能与存储过程几乎一样 区别: 函数必须通过return 关键字返回一个值 存储过程: 不需要return返回值 参数: 输入型参数 输出型参数 输入(输出)型参数 什么时候用存储过程, 什么时候用函数 一般来讲, 当只有一个返回值的时候用函数, 当没有返回值或者需要多个返回值的时候, 用存储过程 二.首先看一下SQL基础 先看要举例的表的内容: 下面开始操作: 首先建一个新的SQL Window: DECLARE --声明变量 /* 引

编程开发之--Oracle数据库--存储过程和存储函数(1)

1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体; 存储过程的调用方式: a)exec/execute 过程名(); b)begin 过程名(); 过程名(); end; / 带参数的存储过程: 举例:为指定的员工涨100块钱工资,并且打印涨前以及涨后的工资. 在sql

Oracle数据库,内置函数小结

1.聚合函数 count(字段) // 求非空行的数量 max(字段) // 获取最大值 sum(字段) //求和 avg(字段) // 平均值 min(字段) // 最小值 2.转换函数 to_date() 字符串转时间 格式: to_date(字符串,'yyyy-mm-dd hh24:mi:ss') 例: to_date ('1970-1-1 15:31:33' , 'yyyy-mm-dd hh24: mi: ss ') to_char() 时间转字符串 格式:to_char ( 某个时间,

Oracle数据库数值、日期函数的学习

一.数值函数的学习 1)number(p,s).number(p).number(*,s),p的值为1-38之间. 2)数值类型的兼容性 --:numeric(p,s) 相当于number(p,s) --:decimal(p,s)或dec(p,s) 相当于number(p,s) --:integer或int(不能指定位数)相当于number(38) --:smallint相当于number(38) --:float相当于number --:double precision相当于number --

Oracle数据库之操作符及函数

一.操作符: 1.分类: 算术.比较.逻辑.集合.连接: 2.算术操作符: 执行数值计算: -- 工资加1000 select empno,ename,job,sal+1000 from emp; 3.比较操作符: -- 比较运算符(between and包头不包尾) select * from emp where sal between 1000 and 2000; (不等于是!=  ,   在mysql中是<>  ) 4.逻辑操作符:and  or  not --查询奖金不为空的员工信息

大型Oracle数据库设计方案(精华)

摘 要 本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境调整 优化设计 方案 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级.通常依此四级调整级别对数据库进行调整.优化,数据库的整体性能会得到很大的改善