
1. ORACLE的逻辑存储结构数据库--表空间--数据段segment表索引回滚等数据--区extent--块block1.1 默认表空间system表空间: 存放内部表和数据字典(包括表试图存储过程的定义等)sysaux表空间system辅助表空间一般不存储用户的数据temp表空间, 存放SQL语句处理的表和索引的信息比如数据排序就占用此空间undo表空间撤销表空间当用户对数据表进行修改操作(包括插入更新删除等操作),Oracle自动使用撤销表空间来临时存放修改前的旧数据2. 日志文件重做日志文件用来记录数据库所发生的更改信息(修改添加删除等)归档日志文件归档模式是在各个日志文件都被写满而即将被覆盖之前先有归档进程将即将覆盖的日志文件中的日志读出写入到归档日志文件中。归档日志文件会占用大量的磁盘空间,默认情况下Oracle系统不采用归档模式alert日志记录Oracle系统的运行信息和错误日志审计日志show parameter audit为什么要审计如果某个重要的表数据被更新了你可能希望找到是谁在什么时候操作的审计可以记录下用户各种操作日志包括执行过的SQL3. Oracle服务器结构前台进程包括用户进程和服务器进程用户进程是指那些能产生或执行SQL语句的应用程序用户进程有两个重要的概念连接和会话连接是一个用户进程与数据库实例之间的通信链路。会话是建立连接后用户与实例之间的交互。服务器进程就是用于处理用户会话过程中向数据库实例发出的SQL语句后台进程DBWR 数据写入进程LGWR日志写入进程ARCH归档进程SMON系统监控进程PMON进程监控进程4. 数据字典dba_tablespace 表空间 没啥鸟用dba_data_files 表空间与数据文件对应关系dba_free_space 剩余表空间大小dba_tablespace_usage_metrics 表空间使用率查看表空间总大小及数据文件信息select file_name,tablespace_name,bytes from dba_data_files查看表空间当前可用空间select tablespace_name,sum(bytes) from dba_free_space group by tablespace_name高斯查询占用表空间大的前20个对象select segment_name,sum(bytes)/1024/1024/1024 as size from my_segments group by segment_name order by size desc limit 20;Oracle 查看数据库占用空间最大的20个表select * from (select segment_name,segment_type,bytes from my_segments order by bytes desc)where rownum20查询表信息行数刷新统计时间select table_name, bytes, num_rows,avg_row_len,blocks,pages,last_analyzed from my_tables查询索引索引行数索引刷新统计时间select table_name,index_name,num_rows,last_analyzed from dba_indexes where table_namedba_ind_columns查询约束select owner,constraint_name,constraint_type from dba_constraints where table_namedba_cons_columns查看表分区信息dba_tab_partitionsdba_part_tables表分区类型分区数量select table_name,partitioning_type,partition_count from dba_part_tables;查看索引分区dba_ind_partitions索引空间回收alter index indexname unusablealter index indexname rebuild online表空间使用率高分析思路1,查看表空间使用率select tt.n, tt.totalsize,round((tt.totalsize-tr.freesize)) usedsizefrom(select tablespace_name n, sum(bytes)/1024/1024 totalsize from dba_data_files group by tablespace_name) tt,(select tablespace_name n,sum(bytes)/1024/1024 freesize from dba_free_space group by tablespace_name) tfwhere tt.ntr.n2查询占用表空间的大对象select * from (select segment_name,segment_type,bytes from my_segments order by bytes desc)where rownum205. 动态视图(system用户才能看v$session)v$version 数据库版本v$parameter 初始化参数v$instance 数据库实例select status from v$instance 查看数据库实例v$session oracle 客户端进程信息select username,osuser,process,paddr,sql_id from v$session where status ACTIVE;常用列sql_hash_value 与v$sqlarea视图里的hash_value关联sql_address 与sql_hash_value两个一起使用标识正在执行的sql语句sql_exec_start 开始执行该sql语句的时间sql_id 正在执行的sql语句id与v$sqlarea视图sql_id关联paddr 拥有这个会话的进程地址与v$process视图中的addr 列关联status session状态active正在执行SQL语句sid session标识serial# 会话序列号用于唯一标识会话对象username 当前session在Oracle中的用户名osuser 客户端操作系统用户名process 客户端进程的IDprogram 客户端程序名machine 客户端执行的机器v$process oracle服务端进程select addr,spid from v$process;常用列spid操作系统的进程idaddr 进程地址与v$session中paddr对应show parameter processes 查看最大连接数默认3000如果连接数超过设置,则数据库连接会失败select count(1) from v$process;v$sqlarea SQL语句select sql_id,sql_text from v$sqlarea;v$locked_object查看正在运行的sqlselect a.program,b.spid,c.sql_text,c.sql_id from v$session a,v$process b,v$sqlarea c where a.paddrb.addr and a.sql_hash_valuec.hash_value and a.username is not nullDB节点CPU使用率高(一般先确认是否Oracle进程CPU高然后获取对应时间段的AWR报告)1执行top发现Oracle占用的CPU很高记下进程pid 123452, 使用如下SQL找到该服务进程对应的会话信息哪个客户端进程触发的会话select * from v$session where paddr(select addr from v$process where spid12345)3,执行如下语句定义相关的SQL语句select a.sid,a.status,a.process, a.program,b.spid,c.sql_text,c.sql_idfrom v$session a,v$process b,v$sqlarea c wherea.paddrb.addrand a.sql_address c.addressand a.sql_hash_valuec.hash_valueand a.username is not nulland a.sidsid4, 采集AWR报告全面分析查询所有session按照cpu占用率排序select a.sid,a.serial#,a.status,a.process, a.program,b.spid,stat.valuefrom v$session a,v$process b,v$sesstat stat, v$statname sm wherea.paddrb.addrand a.sidstat.sidand sm.statistic#stat.statistic#and sm.nameCPU used by this sessionorder by stat.value DESC删除会话alter system kill session sid,serial#6. SQLPLUS 数据库管理工具oracle的客户端工具sqlplus user/pwd数据库实例名 网络连接数据库监听进程必须启动sqlplus system/passworddbname登录到DB节点ssh oracledbipsqlplus / as sysdba (本地连接不需要监听进程)set命令设置运行环境set linesize 200 设置一行显示多少字符show命令 显示SQLPLUS系统变量show allshow parameter 名称; 查看参数alter system set 参数名123; 修改参数spool 文件名 输出查询结果到指定文件spool offcol 列名 for 格式 格式化列显示例子col name format a5col name wrap 当字符串长度超过指定宽度时将超出的部分折叠到下一行start和命令 sql文件 执行一个sql文件start test.sqltest.sqllist 列出最近执行的sql命令connect user/pwd 切换用户模式host 命令 如果已经连上数据库可以通过该方法执行shell命令help index 查看SQLPLUS命令清单describe命令 查看数据对象的结构execute 执行存储过程7. SQL查询select col as 别名 from tab;as 指定别名 as 可选distinct 显示不重复记录where 条件like 通配符 _ 单字符%多字符in a,bselect 1 from tab这里1是占位符可以是任一数字这个语句没有选择表的任何列只是为每行返回一个常量值1通常与exists 子查询语句一起使用exists用于检查子查询是否返回任何行,如果子查询返回至少一行则exists 返回true,否则false示例select * from book b where exists (select 1 from orderbook o where b.bookido.bookid)拼接字符串输出select id||,||name from tablename分组查询 group by经常与聚集函数一起使用count sum avg。。。注意当指定group by 时选择列中任一非聚集表达式内的所有列都应该包含在 group by列中。即group by表达式必须与选择列表达式完全匹配having 子句对group by 子句选择出来的结果进行再次筛选having子句的语法与where相似唯一区别就是having子句可以包含聚合函数注意where子句中不可以使用聚合函数例子select depno,avg(sal) as平均工资 from employee group by depno having avg(sal) 10000;排序 order by列 asc、desc 排序语法格式select col_listfrom tablewhere conditiongroup by col_listorder by col asc|desc多表关联查询内连接inner join on 在内连接的检索结果中所有记录行都必须满足连接条件select 列 from A inner joion B on A.colB.col外连接left join 左外连接right join 右外连接左外连接的查询结果中不仅包含了满足连接条件的数据行而且还包含左表中不满足连接条件的数据行可以三个表以上外连接子查询子查询可以在selectinsertupdatedelete命令中允许是一个表达式的地方使用。子查询必须用括号括起来子查询中不能包括order by 子句子查询最多不能超过255层嵌套单行子查询子查询返回一个值多行子查询子函数有多行值Oracle查询排序后的前10条记录select * from (select * from tt order by n desc)where rownum11数据的集合运算 unionunion, union all,intersect集合操作时各个查询语句返回的结构要一致union 并集不显示重复union all 并集显示重复ORACLE系统函数举例select count(1),substr(col,-2),to_char(time,YYYYMMDDHH24) from tblname group by substr(col,-2),to_char(time,YYYYMMDDHH24) having count(1)1000 order by to_char(time,YYYYMMDDHH24);字符类函数substrs,ilower(s) upper(s)数字类函数round(s,i) 四舍五入转换类to_char(sysdate,YYYY-MM-DD)to_char(sysdate,yyyy-mm-dd hh24:mi:ss)to_date(2010-05-29,YYYY-MM-DD)to_date(2010-05-29 08:15:00,yyyy-mm-dd hh24:mi:ss)聚合类 sum avg,max,count条件判断函数decode条件值1返回值1值2返回值2缺省值case 字段 when 值1 then 返回值1 esle 缺省值 end或 case when 字段条件 then 返回值。。。例 select name,case when id1 then 1else 0 end from t_aaa;窗口函数row_number() over主要用于为查询结果集中的每一行分配一个唯一的序号基本结构row_number() over(partition by col1,col2 order by col3,col4 desc) as num,其中 partition by 用于定义分组逻辑而order by则决定每个分组内的排序方式。在实际应用中row_number()常被用来实现分页查询排序计算以及去重操作。聚合函数与OVER子句select col1,SUM(col2) over(partition by 分区依据列) as 别名,SUM(col2) over(partition by 分区依据列) as 别名from 表名例如select no,name,semester,credit,sum(credit) over(partition by semester) as 总分,avg(credit) over(partition by semester) as 均分from course排名函数与OVER子句RANK(),ROW_NUMBER()函数举例select orderid, productid,sale,row_number() over(partition by productid order by sale desc) as row_num from ordertable8. 表对象删除表drop table tablename删除记录delete from tablename清空表truncate table tablename备份表create table tt_bak as select * from ttcreate table if not exists tt_bak as select * from tt插入表insert into tbname select * from t2insert ignore intotbname values(45,aaa)修改update tt set col1val,col2val...修改表结构增加字段alter table test add col1 varchar2(64)删除字段alter table test drop 字段名8.1 约束非空约束主键约束用于唯一标识一行记录一个表最多只能有一个主键约束主键约束可以由一个列或多个列组成。主键约束同时具有非空约束的特性。唯一性约束强调所在列不允许有相同的值。9. 索引对象为了能找到数据表中的每一行均用一个rowid来标识rowid能标识数据库中某一行的具体位置如果要在表中查询指定的记录在没有索引的情况下必须遍历整个表而有了索引后只需要在索引中找到符合条件的索引字段值就可以通过保存在索引中的rowid快速找到表中对应的记录。oracle系统会自动为表的主键列建立索引创建索引时oracle首先将索引字段进行排序然后将排序后的字段值和对应记录的rowid存储在索引段中。索引设计的原则分区表一般创建本地索引(使用local关键字)不要创建全局索引。索引建立在where子句频繁引用的列上经常需要进行排序的列上频繁进行表连接的关键字不要在小表上建索引对于组合索引要把高原则度的列放在前面。索引的key不易过长唯一索引如果指定一个列为主键oracle会自动创建一个同名的唯一索引唯一约束也会创建同名的唯一索引create unique index 索引列 on 表列普通索引可以出现相同的索引内容允许空值。10. 视图对象视图是一个虚拟表视图并不在数据库中存储数据值其数据值来自定义视图的额查询语句所引用的表。可以在视图中进行insert update,delete 操作。视图可以简化复杂的SQL查询使得用户可以通过简单的查询语句访问复杂的数据集。视图的作用包括简化查询通过将复杂的查询封装成视图用户可以更方便地访问数据。数据抽象视图可以对数据进行抽象隐藏复杂的表结构和数据细节。安全性通过权限控制视图可以限制用户访问特定的数据列或表提高数据的安全性。创建视图create or replace view vname as subquery只读视图create or replace view vname as subquery with read only查看视图定义select text from user_views where view_namevname删除视图drop view ename11. 表分区它在物理上实现了表数据的分离而逻辑上却仍然是一个表。提高查询速度对大表的查询增加修改操作可以分解到表的不同分区来执行创建表分区范围分区关键字 RANGE ,分区的字段可以是一个或多个如选择一个日期列作为分区键create table retail(id integer primary key,retail_date date,product varchar2(50))partition by range(retail_date)(--第一季度分区partition par_01 values less than(to_date(2025-04-01,yyyy-mm-dd)) tablespaces tbsp01,......)通过表分区查询数据select * from retail partition(part_01)查看表分区show create table 表名12. 数据导入导出 exp imp(高斯);导出表结构表数据(导出的是insert 语句)参数filetypebin二进制方式 默认txt,如果使用filetypebinfile 文件名后缀dmp, dmp放ddl语句数据放在同级目录的data下exp tablestable1 filetest.sql filetypeTXT contentall;仅导出表数据(导出的是insert 语句)exp tablestable1,table2 filetest.sql filetypeTXT contentdata_only;仅导出表结构exp tablestable1,table2 filetest.sql contentmetadata_onlyexp导出多个表aaa.txt 里是表名列表 table1,table2tablelist$(cat aaa.txt)zsql db/passwordip:port -c exp tables${tablelist} file\exp.txt\;导入imp tablestablename file文件名 filetypeTXT contentdata_onlydump导出表数据(csv文本格式用于查看)dump QUERY select * from table into file test.csv COLUMNS ENCLOSED BY COLUMNS TERMINATED BY |;dump TABLE tablename into file test.csv COLUMNS BY COLUMNS TERMINATED BY |;导入数据load data infile ttt.csv into table tablename