*************************数据字典*******************************
普通的表 是用来存放 应用程序 需要的数据的
student表 是存放学生信息的
category 表 是存放 商品种类信息的
oracle 也是一个应用程序, oracle这个系统级应用程序本身也需要存放一些数据,这些
数据存到哪张表中呢? 存到一个特殊的表中,这个特殊的表叫做数据字典表,它是为oracle
本身服务的.
演示代码:
--1. 查看当前用户下有哪些表
select TABLE_NAME from user_tables
--2. 查看当前用户下有哪些视图
select VIEW_NAME from user_views
--3. 查看当前用户下有哪些约束
select CONSTRAINT_NAME from user_constraints
select * from user_constraints where constraint_name='SYS_C0016608'
--4.查询dept表有哪些字段
select * from user_tab_columns where table_name='DEPT'
--5.查询到底有哪些数据字典表
select TABLE_NAME from dictionary
--6.查询和用户相关的数据字典表有哪些
select TABLE_NAME from dictionary where TABLE_NAME like 'USER_%'
*********************SQL语句优化最基本的技巧************************
使用字段名 代替 *
因为如果程序员写 select * from emp
oracle执行的时候 会先去查 user_tab_columns这张字典表 把*转换成所有的字段名
查询数据字典需要时间 所以最好使用字段来代替
一.什么是索引
用来提高查询速度的数据库对象
可以理解为 查字典时 的目录
二.为什么用索引
作用: 提高查询速度
索引(类似查字典,按拼音查,按部首查) 张642 页 第5个字
没有索引时
要查的次数 641页*10个字 + 5=6415
有了目录: z 26+3 +5=34
zha
zhan
zhang 642
三.how
创建索引的原则
1. where 条件
group by 条件
order by
在经常查询的字段上加索引...
2. 连接条件
3. 在5m以下的表 查询返回的结果集在5%左右数据时 使用索引
如果是一个超大的表 product表 即使加了索引 也没有太大的作用
如果是一张超大的表 最好的优化策略 大表 划分成若干个小表
手机product 笔记本product ...
创建索引的语法:
create index 索引名 on 表名(字段)
***也可以建立组合索引,查询组合的时候效率更高
create index 索引名 on 表名(字段1,字段2)
select * from 表名 where 字段1=... and 字段2= ..
***************************初始化数据**********************************
select * from category
insert into category values(1,'手机','通讯工具')
begin
for i in 1..500000 loop
insert into product values(i,'商品名称'||i,'商品描述'||i,1);
end loop;
commit;
end;
************************执行计划(解释计划)***********************************
1.没有加索引的时候 默认是全表扫描
Table Access Full
ROWS 基数 Card 预计返回的结果集个数
Bytes 返回的结果集占用的字节数
Cost 耗费 2(0) 占用cpu的百分比
一般Cost越小表示执行计划越优, 执行速度越快,只是一个参考值 ,不一定
Time SQL语句 预计消耗的时间
************************索引的优缺点***********************************
优点: 提高查询速度
缺点:
1. 如果在一个表中频繁做 插入或删除操作 使用索引反而会降低 SQL语句的执行速度
因为插入、删除数据时 不仅要插入数据 而且要维护索引
2. 索引是占用空间的
************************索引的分类***********************************
第一种分法
1. 唯一性索引
主键和 unique 约束的字段 系统会自动为这些字段创建唯一性索引
2. 非唯一性索引
用户手工创建的索引都属于 非唯一性索引
第二种分法
1. 聚集性索引
物理位置上真正排序了 索引顺序和物理顺序是一致的
拼音
2. 非聚集性索引
物理位置上并没有排序 只是建立了一个指针...
部首
********************************oracle中的索引*******************
1. B树索引
适合高基数字段的查询(字段值重复比较少或没有重复)
2. 降序索引
是一种特殊的B树索引
select ename,hiredate from emp
where hiredate between to_date('1981-01-01','yyyy-mm-dd') and to_date('1981-12-31','yyyy-mm-dd')
order by hiredate desc
3. 函数索引
需求: 查询员工名称为SMITH的员工信息
create index index_emp_ename on emp(lower(ename))
select * from emp where lower(ename)='smith'、
降序索引和函数索引都属于B树索引
4. 位图索引
在查询 低基数 字段 上 使用位图索引 可以提高查询性能
低基数(字段值重复比较多) 例如 emp表的 deptno字段
需求: 查询部门编号为10 的员工的信息
部门编号这个字段 重复比较多
只有3个基数 deptno=10、deptno=20、deptno=30
银弹 1987 xxx 发表了篇软件工程的论文
软件工程中没有银弹的概念 10年内没有一种方法或技术 能提高软件产品的生产力提高10倍以上
同样 索引也不是提高性能的百分百绝对的方法...提高性能的最好的方式是提升硬件
一. 什么是序列
oracle 用来产生主键的一种方式
第一次值是1,每次自增1...依次类推
二.how
每一张表都应该有一个序列,该序列专门为这张表创建主键
create sequence seq_表名
例如
create sequence seq_article;
如何使用
insert into article values(seq_article.nextval,'标题1','标题2')
insert into article values(seq_article.nextval,'标题2','标题2')
查询序列当前值
select article.currval from dual;
**************************解决oracle序列从2开始的问题*************************
create sequence seq_article minvalue 0 start with 0 increment by 1