oracle软解析和硬解析

一、软解析和硬解析
一个sql查询在执行前,oracle必须对查询进行解析、限定(命名解析)、安全性检查、优化等步骤。整个过程可以统称为编译sql语句。

oracle解析的步骤如下:
1)语法解析
2)语义解析
3)生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的。
4)sql的执行

解析会占用CPU时间,而解析后的结果会存储在shared pool里面。软解析可以重用执行计划,硬解析每次都要生成执行计划。

二、绑定变量

使用绑定变量可以使sql语句的编译时间大大减少。

当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去sql语句。oracle在接收到这些sql后,会先对这个sql做一个hash函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash值匹配的sql存在。如果找到了,oracle将直接使用已经存在的sql的执行计划去执行当前的sql,然后将结果返回给用户。如果在共享池中没有找到相同Hash值的sql,oracle会认为这是一条新的sql。会进行解析。

绑定变量是一个占位符,使用了绑定变量后,oracle就记住了这个sql语句的模版,或者是模子(缓存在shared pool中)。以后遇到相同模子的sql语句,直接取shared pool中编译后的结果,执行sql。不同语句的区别只是传进来的变量的值不一样。概念和函数调用传入参数类似。

例子:
select * from emp where empno = 123;
select * from emp where empno = 456;
以上两句执行时,oracle会认为是两条不同的sql语句。每条语句都会分别解析。

select * from emp where empno = :no;
这条sql语句,往绑定变量no中传入不同的值123、456,oracle会认为执行的是同一条sql语句,只需要编译一次,达到sql重用的效果。

绑定变量是在P/L SQL中使用。

oracle 11xe版使用体会

其实xe版限制挺多的。

1、固定一个实例
2、4G表空间限制
3、不支持位图索引

11xe版创建位图索引报错

ORA-00439: feature not enabled: Bit-mapped indexes


select * from sys.v_$option where parameter='Bit-mapped indexes';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Bit-mapped indexes
FALSE

查了官方文档确实如此:
http://docs.oracle.com/cd/E17781_01/license.112/e18068/toc.htm#BABHACFJ

Bitmapped index, bitmapped join index No

参考资料:
http://www.oracle.com/pls/xe112/portal.all_books

oracle配置sqlplus环境和autotrace执行计划

一、sqlplus环境配置
创建一个sql脚本,sqlplus.sql:

vim /root/sqlplus.sql

输入以下内容:

set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 100
set pagesize 9999
column plan_plus_exp format a80
set timing on

以后每次登录sqlplus时执行下sqlplus.sql脚本。

其实oracle在$ORACLE_HOME/sqlplus/admin目录有glogin.sql,是sqlplus登录时自动调用的。可以加在这里面。

二、配置autotrace
1、sys用户
使用:

set autotrace on;

打开即可。
继续阅读oracle配置sqlplus环境和autotrace执行计划

oracle数据库对象-视图(2)

创建/修改视图语句:

create or replace view 视图名(列1, 列2, ... , 列n) as (select 列1, 列2, ... ,列n from 表名 where 筛选条件);

删除视图语句:

drop view 视图名;

1、视图就是一个虚表,一个子查询,会写sql语句就会写视图,难一点的就是把几个select结果union或union all连接到一块儿。

2、视图的列和子查询里select后的列,要一一对应关系。

oracle rowid和ora_rowscn

rowid、ora_rowscn都是oracle表中的伪列。

一、rowid

rowid记录的是该行的物理位置,所以查询速度上比索引还要快。它的值绝对不会重复。

rowid的组成:

数据对象编号        文件编号        块编号            行编号
OOOOOO                FFF           BBBBBB             RRR 


详细情况:
http://blog.csdn.net/haiross/article/details/15338061
http://blog.chinaunix.net/uid-23622436-id-3204694.html

二、ora_rowscn

表示每条记录所在块的最后一次修改时间。在同一块中,所有记录的ora_rowscn值是一样的,而且只要有一条记录修改后,该块内所有记录的ora_rowscn都会改变。
继续阅读oracle rowid和ora_rowscn

oracle group by和窗口函数

一、group by

1、分组的实质就是一行(或多行)中的某一列(或多列)具有相同值。

2、组是非空的,如果分组成功,组至少包含一个成员(或行)。

3、组是独特的,意味着,当查询中使用group by时,select列表中就不必使用distinct关键字。

4、当针对非空表的查询(包含group by)中使用聚集函数count时,它绝对不会返回0。至少会返回一个非0值。

二、count(*)和count(列名)

create table fruits (name varchar2(10));

insert into fruits values ('Oranges');
insert into fruits values ('Oranges');
insert into fruits values ('Oranges');
insert into fruits values ('Apple');
insert into fruits values ('Peach');
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);

select name, count(name) from fruits group by name;
select name, count(*) from fruits group by name;

从例子可以看出,count(name)会忽略列的空值行,count(*)不会忽略空值行。

当使用count时,需要考虑是否希望包含NULL。使用count(column),不会计算NULL。

如果希望包含NULL,则使用count(*)对行计数。
继续阅读oracle group by和窗口函数

oracle常用字符串函数

字符串是由两个引号来定义的,而在两个引号中没有任何字符时,表示NULL值。

一、字符串替换
replace和translate函数
replace和translate都是拥有字符替换的功能,replace是以字符串为单位,translate是以单个字符为单位。

语法:replace(‘目标字符串’, ‘待搜索字符串’, ‘替换字符串’)

select replace('123456abcdefg', 'abc', '00') from dual;

结果:12345600defg

语法:translate(‘目标字符串’, ‘待搜索字符’, ‘替换字符’)

select translate('123456abcdefg', 'a1f', '!@#') from dual;

结果:@23456!bcde#g
字符的对应关系:a -> !,1 -> @,f -> #

如果替换字符对应为空,则在目标字符串中去除搜索字符:

select translate('123456abcdefgZ', '#0123456789abcdefg', '#') from dual;

结果为Z。

可以用这个特点来检测一个字符串的字符是否在某个范围内,如果返回空,则字符串在目标字符范围内。
translate函数第三个参数不能为空,否则结果是NULL。replace函数第三个参数为空表示将待搜索的字符串去除。
继续阅读oracle常用字符串函数

oracle单引号

oracle单引号
一般是第一个单引号和最后一个单引号组成一个字符串,中间再遇到单引号就是转义字符

select '''' from dual;

///输出一个单引号


select '||' from dual;

///输出||


select 'name||' from dual;

///输出name||


select 'name'||'''' from dual;

///输出name’,||作为连接符,把name和一个单引号连接在一起

oracle数据库对象-表(2)

对表插入、更新、删除数据

一、insert

insert into 表名 (字段1, 字段2, ... ,字段n) values (值1, 值2, ... ,值n);

1、写字段列表,可以只写部分字段(主键和非空),其它字段默认为空(null)。

insert into emp (empno, ename) values (99, 'APPLE');

也可以把所有字段都写出来。

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (98, 'JACK', NULL, NULL, NULL, NULL, NULL, NULL);

2、不写字段列表,值必须按照表中字段的默认顺序排列,并且必须为每个列提供一个值。

insert into emp values (100, 'TOM', 'SALESMAN', 7698, to_date('19860101000000', 'yyyymmddhh24miss'), 3000, 100, 30);

字符和日期值应放在单引号中;
数字值不应放在单引号中,因为对于指定为number数据类型的字段,如果使用了单引号,可能会发生数字值的隐式转换。
继续阅读oracle数据库对象-表(2)

oracle中order by学习

一、
order by子句是对select语句查询后的结果集进行排序。按照desc降序,asc升序,默认为升序。

二、
order by子句后面可以跟列名、数字、随机函数。

1、列名
表示按照某个列来排序。

select ename, job from emp order by ename;

2、数字
数字作用和列名一样,指明了按照select列表中相应位置的列来排序。

select ename, job from emp order by 2;

如果数字超出了select后面列的数量,会报错:

ORA-01785: ORDER BY item must be the number of a SELECT-list expression

继续阅读oracle中order by学习

软件及互联网爱好者