什么是执行计划
执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述。
执行计划的常用列字段解释:
- 基数(Cardinality):Oracle 估计的当前操作的返回结果集行
- 字节(Bytes):执行该步骤后返回的字节数
- 耗费(COST)、CPU 耗费:Oracle 估计的该步骤的执行成本,用于说明 SQL 执行的代价,理论上越小越好(该值可能与实际有出入)
- 时间(Time):Oracle 估计的当前操作所需的时间
使用执行计划
通过工具启动执行计划。选中需要查看执行计划的查询语句,在工具栏中选
Tools--->Explain Plan 或者 或者是选择需要查看执行计划的查询语句后按 F5。
执行顺序
缩进最多的最先执行;(缩进相同时,最上面的最先执行)
表访问的几种方式(非全部):
- TABLE ACCESS FULL(全表扫描)
- TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取)
- TABLE ACCESS BY INDEX SCAN(索引扫描)
TABLE ACCESS FULL(全表扫描):Oracle 会读取表中所有的行,并检查每一行是否满足 SQL 语句中的 Where 限制条件;使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到表数据总量的 5% ~ 10% 或以上。
TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取):行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID 可以快速定位到目标数据上,这也是 Oracle 中存取单行数据最快的方法;(ROWID 是由 Oracle 自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储 ROWID 的值。)
TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中,既存储每个索引的键值,也存储具有该键值的行的 ROWID
索引扫描其实分为两步
- 扫描索引得到对应的 ROWID。
- 通过 ROWID 定位到具体的行读取数据。
五种索引扫描
- INDEX UNIQUE SCAN(索引唯一扫描)
- INDEX RANGE SCAN(索引范围扫描)
- INDEX FULL SCAN(索引全扫描)
- INDEX FAST FULL SCAN(索引快速扫描)
- INDEX SKIP SCAN(索引跳跃扫描)
Oracle 的优化器
- RBO(Rule-Based Optimization) 基于规则的优化器(基本被抛弃)
- CBO(Cost-Based Optimization) 基于代价的优化器
CBO 优化器
CBO 是一种比 RBO 更加合理、可靠的优化器,在 ORACLE 10g 中完全取代 RBO。CBO通过计算各种可能的执行计划的“代价”,即 COST,从中选用 COST 最低的执行方案作为实际运行方案。
- 等值链接的查询效率高于子查的执行效率
- 建立适当的索引可以提高查询效率
- 尽可能少的使用like关键字进行模糊查询
- 尽量避免*号代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描
Oracle 的数据导入与导出
数据库导入导出需要注意
1.目标数据库要与源数据库有着名称相同的表空间。
2.目标数据在进行导入时,用户名尽量相同(这样保证用户的权限级别相同)。
3.目标数据库每次在进行数据导入前,应做好数据备份,以防数据丢失。
4.弄清是导入导出到相同版本还是不同版本(oracle10g 版本与 oracle11g 版本)。
5.目标数据导入前,弄清楚是数据覆盖(替换),还是仅插入新数据或替换部分数据表。
6.确定目标数据库磁盘空间是否足够容纳新数据,是否需要扩充表空间。
7.导入导出时注意字符集是否相同,一般 Oracle 数据库的字符集只有一个,并且固定,一般不改变。
8.确定操作者的账号权限
导出数据格式介绍
- Dmp 格式:.dmp 是二进制文件,可跨平台,还能包含权限,效率好。
- Sql 格式:.sql 格式的文件,可用文本编辑器查看,通用性比较好,效率不如第一种,适合小数据量导入导出。尤其注意的是表中不能有大字段 (blob,clob,long),如果有,会报错。
- Pde 格式:.pde 格式的文件,.pde 为 PL/SQL Developer 自有的文件格式,只能用 PL/SQLDeveloper 工具导入导出,不能用文本编辑器查看。
传统方式 exp(导出)和(imp)导入:
命令执行方式
该命令需要在操作系统的命令窗口执行,而非 sql/plus
在使用导出或导入命令时,在命令的后侧不要添加分号。
命令执行方式
该命令需要在操作系统的命令窗口执行,而非 sql/plus
在使用导出或导入命令时,在命令的后侧不要添加分号。
命令格式
exp|imp 用 户 名 / 密 码 @ 连 接 地 址 : 端 口 / 服 务 名 file= 路 径 / 文 件 名 .dmp
full=y|tabels(tablename,tablename...)|owner(username1,username2,username3)
- exp:导出命令,导出时必写。
- imp:导入命令,导入时必写,每次操作,二者只能选择一个执行。
- username:导出数据的用户名,必写;
- password:导出数据的密码,必写;
- @:地址符号,必写;
- SERVICENAME:Oracle 的服务名,必写;
- 1521:端口号,1521 是默认的可以不写,非默认要写;
- file="文件名.dmp" : 文件存放路径地址,必写;
- full=y :表示全库导出。可以不写,则默认为 no,则只导出用户下的对象;
- tables:表示只导出哪些表;
- owner:导出该用户下对象;
- full|tables|owner:只能使用一种;
导出数据
exp 用户名/密码@oracle 的连接地址:端口/需要导出的服务名 file=路径/文件名.dmp
将 HR 用户下的对象导出。
exp hr/oracle@localhost:1521/orcl file=d:/1.dmp
导入数据
imp 用户名/密码@oracle 的连接地址:端口/需要导出的服务名 file=路径/文件名.dmp
将导出的 dmp 文件导入到数据库中。
imp hr/oracle@localhost:1521/orcl file=d:/1.dmp
使用 PL/SQL Developer 实现数据的导入与导出
![887beb85c0bd00dfdc18c1ae3325acea.png](https://i-blog.csdnimg.cn/blog_migrate/563c35658296351d8562edbb841cd6a9.jpeg)
导出 DMP 格式
![cacdc3d629fe812ad88556c27928788c.png](https://i-blog.csdnimg.cn/blog_migrate/d22e76d7f32c5af14755e15bc0b9cd8a.jpeg)
导入 DMP 格式
![59dd77aed54fcf314aa82ee138e8d572.png](https://i-blog.csdnimg.cn/blog_migrate/824bbea88ec5411d636b0cf3857b44db.jpeg)
导出 SQL 格式
![3587269db42a14867b6d6bc82c5a6e2f.png](https://i-blog.csdnimg.cn/blog_migrate/c085ddf11380532e1d19a10150c9a01c.jpeg)
导入 SQL 格式
![7235a41d0e3afb6dd73925b11064a0f3.png](https://i-blog.csdnimg.cn/blog_migrate/13e36e56fa9d0a7560e39dad6fcc0dbb.png)
导出 PDE 格式
![ca9acec307573b7eb61d9c84e13aabd1.png](https://i-blog.csdnimg.cn/blog_migrate/e5b0c3825fbe014416ea17b803fd22e7.jpeg)
导入 PDE 格式
![cab6a2ce5ff25b32fe5524d355d0d4bf.png](https://i-blog.csdnimg.cn/blog_migrate/a68b8a97ede65760c08a6fcff6fa8ca7.jpeg)
数据中其他对象的导入与导出
![f9c754dcff287470042e37691427b567.png](https://i-blog.csdnimg.cn/blog_migrate/28504bec1a6a33b81ededa62f23669dd.jpeg)
导出数据库对象(导出的是sql文件)
![22d0be13d11c84a3765256500ec49c25.png](https://i-blog.csdnimg.cn/blog_migrate/9fcd81f75d747744ddaf1cf68ec1adde.jpeg)
导入用
![f9e3a7ab8260e68d3776cfebdaf0f695.png](https://i-blog.csdnimg.cn/blog_migrate/81acbdf1336751a91870c399fefdab90.png)
-----------------------------------
MySQL 数据库的使用
MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 特点
- MySQL 是开源的,所以你不需要支付额外的费用。
- MySQL 支持大型系统的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 存储数据量较大,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为 8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
MySQL 与 Oracle 的区别
实例区别
- MySQL 是轻量型数据库,开源免费。Oracle 是收费的而且价格非常高。
- MySQL 一个实例可以操作多个库,而 Oracle 一个实例只能对应一个库。
- MySQL 安装完后 300M 而 Oracle 有 3G 左右。
操作区别
- 主键: MySQL 一般使用自动增长类型,而 Oracle 则需要使用序列对象。
- 单引号的处理: MySQL 里可以用双引号包起字符串,ORACLE 里只可以用单引号包起字符串。
- 分页的 SQL 语句: MYSQL 用 LIMIT,而 Oracle 需要使用内建视图和 rownum 伪列。
- 事务处理:MySQL 默认是自动提交,而 Oracle 默认不自动提交,需要用户 CTL 语言进行事务提交
操作 MySQL
创建数据库 areate database数据库名 default character set 字符编码;
创建数据库:create database test default character set utf8;
查看数据库:show databases;
查看数据库编码:select schema_ name,default_character_set_name from information_ schema.schemata where schema_ name = 'test';
删除数据库 Drop database +数据库名称;
删除 test 数据库
drop database test;
创建一个名称为 bjsxt 的数据库,编码为 utf8
create database bjsxt default character set = utf8;
选择该数据库
use bjsxt;
MySQL 中的数据类型
数值类型
MySQL 支持所有标准 SQL 数值数据类型。
作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。
![dc5a19629db62d1d5a615b3f7500a786.png](https://i-blog.csdnimg.cn/blog_migrate/c4b05ee5680ef16db06e5435928b0685.png)
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用例如:int(3),如果实际值是 2,如果列指定了 zerofill,查询结果就是 002,左边用 0 来填充
浮点型
![a779e2aa4fbe24e4639296fb03176309.png](https://i-blog.csdnimg.cn/blog_migrate/2879597d0600d39aafbe936437737eaa.png)
字符串型
![a49cfb300adc2166ca1d5d10a452e2ee.png](https://i-blog.csdnimg.cn/blog_migrate/f6849b5e8b40f6c30a0e3ae8640e0c61.png)
char 和 varchar
char(n) 若存入字符数小于 n,则以空格补于其后,查询之时再将空格去掉。所以 char类型存储的字符串末尾不能有空格,varchar 不限于此。
char 类型的字符串检索速度要比 varchar 类型的快。
varchar 和 text
- varchar 可指定 n,text 不能指定,内部存储 varchar 是存入的实际字符数 +1 个字节(n<=255)或 2 个字节(n>255),text 是实际字符数 +2 个字节
- text 类型不能有默认值。
- varchar 可直接创建索引,text 创建索引要指定前多少个字符。varchar 查询速度快于 text, 在都创建索引的情况下,text 的索引似乎不起作用。
日期类型
![fc25dc99ba4759b439e3137e64700540.png](https://i-blog.csdnimg.cn/blog_migrate/3bd8cc2e78d774a9976bd490c7c00a36.jpeg)
创建表与删除表
通过 DDL 语句创建表
创建一个 employees 表包含雇员 ID,雇员名字,雇员薪水
create
查看已创建的表 Show tables;
通过 DDL 语句删除表
删除 employees 表
drop table employees;
使用 DDL 语句修改表名 alter table 旧表名 rename新表名
创建一个 employees 表包含雇员 ID,雇员名字,雇员薪水
create
将 employees 表名修改为 emp
alter
使用 DDL 修改列名 alter table表名 change column旧列名 新列名 类型
将 emp 表中的 lastname 修改为 name
alter
使用 DDL 语句修改列类型 alter table表名 modify 列名 新类型
将 emp 表中的 name 的长度指定为 40
alter
使用 DDL 语句添加列 alter table表名 add column新列名 类型
在 emp 表中添加一个新的列为 commission_pct
alter
使用 DDL 语句删除列 alter table 表名 drop column列名
删除 emp 表中的 commission_pct
alter