记录下Oracle默认表,函数,优化。

系统自带表

oracle中像mysql一样提供了一些系统表或者函数。这些表代表这数据库的基本信息。
包含比较全面的数据库信息, 用户表信息。

dba_开头

主要存储的是 数据库信息和数据库文件的信息 
 
dba_users 数据库用户信息
dba_segments 表段信息
dba_extents 数据区信息
dba_objects 数据库对象信息
dba_tablespaces 数加粗样式据库表空间信息
dba_data_files 临时数据文件信息
dba_temp_files 临时文件信息
dba_rollback_segs 回滚段信息
dba_ts_quotas 用户表空间配额信息
dba_free_space 数据库空闲空间信息
dba_profiles 数据库用户资源限制信息
dba_sys_privs 用户的系统权限信息 
dba_tab_privs 用户具有的对象权限信息 
dba_col_privs 用户具有的列对象权限信息 
dba_role_privs 用户具有的角色信息 
dba_audit_trail 审计跟踪记录信息 
dba_stmt_audit_opts 审计设置信息 
dba_audit_object 对象审计结果信息 
dba_audit_session 会话审计结果信息 
dba_indexes 用户模式的索引信息
User表 用户表

user_ 开头

user_objects 用户对象信息 
user_source 数据库用户的所有资源对象信息 
user_segments 用户的表段信息 
user_tables 用户的表对象信息 
user_tab_columns 用户的表列信息
user_tab_comments 用户表备注信息
user_constraints 用户的对象约束信息 
user_sys_privs 当前用户的系统权限信息 
user_tab_privs 当前用户的对象权限信息 
user_col_privs 当前用户的表列权限信息 
user_role_privs 当前用户的角色权限信息 
user_indexes 用户的索引信息 
user_ind_columns 用户的索引对应的表列信息 
user_cons_columns 用户的约束对应的表列信息 
user_clusters 用户的所有簇信息 
user_clu_columns 用户的簇所包含的内容信息 
user_cluster_hash_expressions 散列簇的信息

作者写了两个常用的例子:

select table_name,owner from dba_tab_columns t where t.COLUMN_NAME like upper('%username%'); 

查找某字段属于哪个表中信息

select count(*) from user_tab_columns where table_name = upper('TABLECOLUMN')

查找某个表中的字段个数(有多少列)

p.s. oracle默认表中的数据都是大写包括重命名后的字段名。均为大写,在java中和sql中有严格要求

继续
查找表文件信息

select * from dba_data_files; //表文件名 位置 占用大小等信息

查找表空间

select * from dba_tablespaes; //查找表空间 表空间名

查找索引

select * from dba_indexes; //查找所有索引信息

用户表的结构应该比较常用

select * from user_tab_columns 
//列名
table_name  表名 
column_name 字段名
data_type 字段类型
column_id 字段号(在表中第几个字段)
//用户表提供查询表列备注信息
select * from user_tab_comments where table_name = 'TABLE'
//查询列备注
select * from user_col_comments where table_name = 'TABLE' and column_name = 'COLUMN'

可以使用查询字段名的方式 来操作一些数据

SQL执行顺序

sql执行顺序可以用来优化sql运行速度。 全部目标以缩小查询范围来进行。比如 where条件先筛选出数据,在去做group by进行分组,这是基本思路。

 1. from
 2. on
 3. join
 4. where
 5. group by
 6. having
 7. select
 8. distinct
 9. union
 10.order by 

sql优化中 以执行顺序最为重要, 例如 where 以及 order by 涉及的列上建立索引。
比如like 关键字的优化, 当like ‘A%’ 常量开头时候会调用索引

select * from student where name like '张%';
select * from student where name like '%东%';
select * from student where name like '%西';

第一条以常量开头会默认调用索引,但第一语句查找的就是所有记录,则走索引和全盘检查都是一样的结果。 可以换

select * from student where name like '张东%';
//或者
select count(*) from student where name like '张%'

以常量结尾可以使用 reverse()函数 来反转变量

reverse('123456') //65321 
//sql 写法
select * from student where revers(name) like reverse('%西')

//该语句具体能做到查询以西为结尾的学生信息
//实际测试下来 确实有优化
//但有人评论说汉字使用反转函数可能出现问题,具体没做测试
//情酌情使用,两语句相比较,在数据量不是特别大的情况优化很小

sql的优化是个比较细节性的问题,是在基础sql上实现查询的更近一步,主要应对的是 数据量比较大的时候 sql查询导致系统延迟过大的解决方案。
但先了解可以养成写出效率比较高的sql,来直接避免后续系统出现问题在去更改sql的麻烦。 找机会整理下sql优化的方案和细节。也在学习中。

oracle中常用的函数

常用的数学函数

ceil(n)  floor(n) 
大于     小于   或等于数值n的最小(最大)整数

常用的字符串替换 取出函数

initcap(char) 把每个字符串的第一个字符换成大写
lower(char)   整个字符串换成小写
replace(char,str1,str2) 字符串中所有str1换成str2 
substr('char',m,n) 取出从m字符开始的n个字符的字符串
//在oracle中 m为0或者1时,都是从头开始截取 当为2时,则从h开始截取包括h
//当m为负数的时候 从最后一位开始截取 -1为 r,-2为'ar'
length(char)  求字符串的长度 index 0

常用的字符串处理函数

to_number() 字符串转换数字
to_char() 数字转换字符串
concat(char1,char2)  连接字符串 char2到char1 中
incap(string) 第一个字母大写
upper(string) 全部字母大写 
// upper 在用系统用户表查询时候 例如表名,字段名必须全部大写.用到该函数
replace(string,if,then) 替换字符串string中的if字符串变为then字符串.

select查询优化

主要在系统中查询时避免全盘查询,
使用查询索引和查询顺序规则优化。

  1. select子句中 避免使用 ‘ * ’ 查询条件
    select * from 表中 会由数据字典来组成所有表内字段 避免在子查询时,在子句中尽量拼写列名
  2. SQL语句用大写
    oracle 中 先解析SQL语句后,会默认把小写转换成大写的在执行语句
  3. WHERE子句中的连接顺序
select... from emp e where sal>50000 and job = 'manager' and 25<(select count(*) from emp where mgr=e.empno)

select ... from emp e where 25 <(select count(*) from emp where mg=e.empno) and sal > 50000 and job = 'MANAGER'
//这是网上复制最多的一个例子 实际应该不能发生.  应该没人会先写select子句 再去完善条件 
  1. oracle 自带的回滚和提交,请多使用COMMIT
    尽量多使用 commit 提交 DML 操作。
    p.s. TRUNCATE 替代 DELETE ,俩者同为删除方法, 但DELETE方法可以被回滚,数据内会有留存,不使用COMMIT命令,数据会恢复到删除命令调用前状态
    而 TRUNCATE 命令运行后 数据不能被恢复 ,所以资源被调用的少 执行时间短。

5.EXISTS 和 IN

select t.name,t.sex from A t where t.dr = 0 and exists (select B.id from B m where t.pk = m.pk)

首先俩者功能相同, 但执行顺序完全相反。
EXISTS 是先执行主查询 ,exists 必须在 子句中添加 与主表的连接条件来达到过滤的目的。 先查询完的所有数据,然后每一行去和后面exists 子句进行匹配。为true保留,为false则不保留,最后返回查询的结果集。

IN 是先执行IN 子句 ,先进行IN关键字之后的子查询,

select t.name,t.sex from stu A where t.dr = m.id in (select ... from B m where m.pk = t.pk)

IN 先做子查询 得到结果集 和主表做笛卡尔积。然后根据条件筛选条件得到的最后的结果集。
主查询数据多则用exists , 子表查询数据多用in。

2021年4月 记 发现Oracle or 的用法和联合索引
最近一直在整理数据,数据量不是特别大也是几十万级别的, 虽然没到百万,但根据需求来查询的时候还是很慢,后来分析,where条件中有四个字段。并且有四个字段的联合索引。 因为走or(并且条件) 的时候默认会走全盘。就学习了一下联合索引,

联合索引 指的一个index里包括了多个字段来构成一个联合索引。 联合索引在使用 索引内字段时候,会引发索引查询。 我现在的浅显理解,认为联合索引建立的目的 就是以 and为连接同时满足来优化查询结果。
但是我工作的项目里和我工作的库中,索引是联合索引构建,但java内部代码用JPA实现的 like + or的JPA拼接语法。 肯定不走索引。 找了许久 有俩点。
用and 时: 联合索引有最左定律, 在建立索引时候 会建立列的编号,当索引最左列不包含在条件中的时候,还是走的全盘。一定需要包含条件index最左列。
用 or 时: 目前还是理解不到位,毕竟不是专业的DB 。采用了一个治标不治本的方式(因为不想去动工作的数据库,毕竟才刚来)。这个方式就是 强制使用索引 ,oracle中提供了强制使用索引

select /*+ INDEX(表名 索引名) */ * from student where 索引列=xxx 

这条语句中 条件可以是联合索引中的 存在的任意字段,并且可以无视最左原则。
但这个方式 治标不治本,因为我是中途加入到项目中,还是个弟弟。 框架已经定好,而且没有专业的DB解决数据问题。 但现在又要做数据导入导出才使用这个方式。 直接采用JPA在JAVA代码中 运行原生sql 。

我打算有时间 ,我自己创建个数据库模拟一些假数据 来达成 这个的测试。 数据库的索引 在网上都是一些简单和原理性的介绍,没找到太多实际的问题解决思路。 =、= 好像伸手伸习惯一样。
还是决定好好学学原理问题 在去解决问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值