欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

oracle数据库

程序员文章站 2022-05-27 21:33:44
...

oracle数据库 无 /**********Oracle中的SQL性能优化****************/ 村长 12800258851.索引方面1.1 应该尽量避免在where子句中对字段null进行判断,否则否则将导致引擎放弃使用索引而进行全表扫描例子:如 select id from t where num is null可以在num上设置

oracle数据库
/**********Oracle中的SQL性能优化****************/  村长 1280025885
1.索引方面


1.1 应该尽量避免在where子句中对字段null进行判断,否则否则将导致引擎放弃使用索引而进行全表扫描
例子:如 select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

1.2 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。

1.3 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
  可以这样查询:(使用union all来查询)
  select id from t where num=10
  union all
  select id from t where num=20

1.4 in 和 not in 也要慎用,否则会导致全表扫描,如:
    select id from t where num in(1,2,3)
  对于连续的数值,能用 between 就不要用 in 了:
  select id from t where num between 1 and 3
1.5 下面的查询也将导致全表扫描: 对于大量模糊查询使用lucene等查询
  select id from t where name like '%abc%'
  若要提高效率,可以考虑全文检索。
1.6 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
  select id from t where num=@num
  可以改为强制查询使用索引:
  select id from t with(index(索引名)) where num=@num
1.7 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
  select id from t where num/2=100
  应改为:
  select id from t where num=100*2
1.8 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
  select id from t where substring(name,1,3)='abc'--name以abc开头的id
  select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
  应改为:
  select id from t where name like 'abc%'
  select id from t where createdate>='2005-11-30' and createdate
    				    				            	            	
            	            	
            	    				                	
            		                	
/*********************oracle数据库sql语句**********************/
1.创建表
/***********
注意的地方:
1.尽量使用number类型,或者varchar
2.如果是主键,或者唯一约束,默认带有索引,可以提高性能
3.如果能设置默认值,最好设置默认值为0

***********/
1.1 oracle普通建表语句

create table user(
 id number(6),
 name varchar(20),
 sex number(1)
)
1.2 不带约束名的建表语句

create table user(
 id number(6) primary key,                 --主键
 name varchar2(20) not null,               --非空
 sex number(1),
 age number(3) default 18, 
 birthday date,
 address varchar2(50),
 email varchar2(25) unique,                --唯一 
 tel number(11), 
 deptno number(2) references dept(deptno)  —外键 
 );
1.3 带约束名的建表语句

create table user(
 id number(6) constraint id_pk primary key,
 name varchar2(20) constraint name_nn not null,
 sex number(1),
 age number(3) default 18,
 birthday date,
 address varchar2(50),
 email varchar2(25) constraint email_uqe unique,
 tel number(11),
 deptno number(2) constraint dept_deptno_ref references dept(deptno)
 );

1.4 带约束列的sql语句

create table userInfo ( 
 id number(6), 
 name varchar2(20), 
 sex number(1), 
 age number(3) default 18, 
 birthday date, 
 address varchar2(50), 
 email varchar2(25),
 tel number(11), 
 deptno number(2), 
 constraint id_pk primary key (id),--也可以两个以上,联合主键 
 constraint dept_deptno_ref foreign key (deptno) references dept(deptno), 
 constraint emial_name_uqe unique (email, name) 
);

1.5 alert模式
 oracle 添加一个字段
 alter table user add(msn varchar2(20));

 oracle 修改一个字段的长度
 alter table user modify(msn varchar2(25));

 oracle 删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)
 alter table user drop(msn);

 修改表名 很少修改
 rename user to student

 删除表
 drop table user;

 删除主键
 alter table user drop constraint id_pk;

 添加主键
 alter table user add constraint id_pk primary key (id);

/*******
主键和唯一索引的区别:
1、主键每张表只可以有一个,唯一索引可以有多个
2、主键列不允许有NULL数据,唯一索引可以
3、主键列一定是唯一索引列,唯一索引列不一定是主键列
*******/


1.6 创建索引

 普通索引:create index idx_dpt_dname on dept(dname);
 联合索引:create index idx_dept_dname_deptno on dept(dname, deptno);
 唯一索引: create unique index idx_emp_ename on scott.emp(ename);
 反向键索引: create index on scott.emp(empno) reverse;
 位图索引: create bitmap index idx_emp_name on scott.emp(dname);

1.7 创建索引

 create sequence seq; 
 select seq.nextval from dual;
 insert into tab values(sql.nextval, ‘id1’);
 创建索引
 create sequence seqtab 
        start with 2 –从2开始 
 	increment by 3—每次加3
 	nomaxvalue—没有最大值
 	minvalue 1—最小值1
 	nocycle—不循环 
 	nocache;--不缓存

2 创建表空间

2.1创建表空间
 create tablespace HooMS
 datafile 'E:\HooMS.dbf' 
 size 5M
 autoextend on next 2M maxsize 10M;
 
2.2创建用户、分配可以操作表空间
 
 create user hoo 
 identified by hoo 
 default tablespace HooMS 
 temporary tablespace temp;
 
 
 
2.3创建表空间
 
 create tablespace myMS
 datafile 'c:\myMS.dbf'  
 size 1M
 autoextend on;
 
 
 
2.4扩展表空间--修改表空间大小
 
 alter database 
 datafile 'c:\myMS.dbf'  
 resize 2M;
 
 
 
2.5扩展表空间--添加数据文件
 
 alter tablespace myMS 
 add datafile 'c:\myMS_2.dbf'  
 size 1M;
 
2.6设置dbf文件自动增长
 
 alter database  
 datafile 'c:\myMS_2.dbf' 
 autoextend on next 2M maxsize 4M;
 
  
 2.7表空间重命名
 
 alter tablespace myMS
 rename to hooMS;
 
2.8分离表空间(脱机)
 
 alter tablespace hooMS
 offline temporary;
 
 2.9归档模式下脱机
 
 alter tablespace hooMS 
 offline immediate;
 
2.10使表空间联机
 
 alter tablespace hooMS online;
 
2.11删除无数据的表空间
 
 drop tablespace hooMS;
  
2.12删除带数据的表空间
 
 drop tablespace hooMS
 including contents;
 

3.oracle 查询sql语句


4.oracle 插入sql语句

4.1 插入所有字段
insert into user values ("id","name",0)
/*** 如果有日期需要修改日期格式

4.2 插入部分字段 
insert into user (id,name,sex) values("id1","name1",0)

4.3 如果插入null
insert into user (id,name,desp) values("id1","name1",null)
/*** 如果查询null 怎么写
错误 select * from user u where u.desp = null
正确 select *  from user u where u.desp is null

5.分组语句


6.oracle 数据库事物处理

7.oracle 数据库数据完整性

oracle PLSQL

8.0 简单存储过程

语法:
创建存储过程基本语法:
create procedure 过程名(参数1…)
is
begin
	执行语句;
end;

例子:如果向user表中插入一条记录
create procedure adduser
is
begin
insert into user(id,name) values("5","user5")
end;


例子:使用存储过程删除一条记录
create procedure proc2(in_empno number)
is
begin
	delete from emp where empno=in_empno;
end;

存储过程的调用
1.sqlplus 控制台
execute/call 过程名(参数1…);
2.java中使用callableStatement接口

/*****建议
当定义变量是时,建议用v_作为前缀v_sal
当定义常量constant是时,建议用c_作为前缀c_sal
当定义游标cursor时,建议用_cursor作为后缀emp_cursor
当定义例外时,建议用e_作为前缀e_error
块(编程):过程(存储过程)、函数、包(包体)、触发器。块是他们的基本编程单元。
******/

9 oracle 触发器

创建触发器基本语法:
create [or replace] trigger触发器名
{before | after}
{insert|delete|update[of 列1[,列2…]]}
on [方案名.]表名
[for each row]
[when 条件]
begin
--触发器内容
end;










/*********sql常用语句**************/
1.常用sql
1.1 查询Oracle正在执行的sql语句及执行该语句的用户

SELECT b.sid oracleID,  
       b.username 登录Oracle用户名,  
       b.serial#,  
       spid 操作系统ID,  
       paddr,  
       sql_text 正在执行的SQL,  
       b.machine 计算机名  
FROM v$process a, v$session b, v$sqlarea c  
WHERE a.addr = b.paddr  
   AND b.sql_hash_value = c.hash_value
 
1.2 查询oracle当前被锁对象
SELECT l.session_id sid,  
       s.serial#,  
       l.locked_mode 锁模式,  
       l.oracle_username 登录用户,  
       l.os_user_name 登录机器用户名,  
       s.machine 机器名,  
       s.terminal 终端用户名,  
       o.object_name 被锁对象名,  
       s.logon_time 登录数据库时间  
FROM v$locked_object l, all_objects o, v$session s  
WHERE l.object_id = o.object_id  
   AND l.session_id = s.sid  
ORDER BY sid, s.serial#;  

1.3 查询oracle 执行过的sql
SELECT * FROM V$SQLAREA T ORDER BY T.LAST_ACTIVE_TIME DESC;