Oracle数据库:oracle执行计划性能代价cost,全表扫描速度慢,索引扫描速度快

Oracle数据库:oracle执行计划性能代价cost,全表扫描速度慢,索引扫描速度快

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开
测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库
这oracle比sql安全,强大多了,所以你需要学习,最重要的,你要是考网络警察公务员,这玩意你不会就别去报名了,耽误时间!
oracle系列文章:
【1】Oracle数据库:啥是oracle数据库?你为啥要学oracle?
【2】Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样
【3】Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
【4】Oracle数据库:创建表空间,创建新用户,给用户分配对象、角色和系统权限,登录新用户建表
【5】Oracle数据库:链接配置,包括sqlnet.ora里面的transnames.ora配置数据库标识符SID,listener暂时简单了解
【6】Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库
【7】Oracle数据库:oracle字符类型、数字类型、创建表表名的命名规则
【8】Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写
【9】Oracle数据库:表的关系:一对多,一对一,多对多,一一继承和修改的关系,表不是重点,重点是数据和约束关系
【10】Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
【11】Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
【12】Oracle数据库:逻辑运算and,or,not和各种运算的优先级控制
【13】Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
【14】Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
【15】Oracle数据库:数字函数,日期函数,round,trunc,mod,months_between,add_months,next_day,last_day,sysdate
【16】Oracle数据库:oracle数据类型转换to_char()日期和数字转字符,to_number()字符转数字,to_date()字符转日期函数
【17】Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数
【18】Oracle数据库:条件表达式case when then else end,decode函数,oracle单行函数练习示例
【19】Oracle数据库:oracle多表查询,等值连接,非等值连接,自连接的sql语句和规则
【20】Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
【21】Oracle数据库:自然连接natural join,using语句,注意避免写交叉连接
【22】Oracle数据库:oracle内连接inner join on,多表查询各种自链接、内连接、外连接的练习示例
【23】Oracle数据库:oracle组函数,聚合函数,多行函数,avg,sum,min,max,count,group by,having
【24】Oracle数据库:oracle嵌套分组函数(聚合函数),组函数的练习题,挺复杂的,用好decode函数,很有趣
【25】Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例
————前面这些都是数据库查询语言的重要知识,一定要牢牢掌握和熟悉
后面的相对简单一点
【26】Oracle数据库:数据库操纵语言DML,插入insert into where,更新update where,删除delete where
【27】Oracle数据库:oracle事务处理语言TCL,commit,rollback,savepoint语句
【28】Oracle数据库:oracle数据定义语言DDL,查询表、序列、索引、视图、创建表,修改表的列alter,rename to,删除表数据truncate和表drop
【29】Oracle数据库:oracle用命令定义非空not null,unique唯一性,主键primary key,外键foreign key,check检查,启用enable,禁用disable约束
【30】Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
【31】Oracle数据库:序列sequence的创建,查询,修改,删除,increment by,start with等关键字
【32】Oracle数据库:创建、修改、删除、使用同义词synonym和索引index
【33】Oracle数据库:创建用户user,设置密码,创建角色role,赋予权限grant,撤销权限revoke


oracle执行计划

在这里插入图片描述
当前语句的最好方案
在这里插入图片描述
plsql工具来配置一波看看

tools
preference
window types
planwindow
avaialbe–>selected

我这个界面好像没有哎
换这个地方了,配置哈哈哈哈哈
在这里插入图片描述

object owner对象拥有者
name名字
cost代价值,很重要,代价地,查询性能越高
cardinality返回的结果的函数
bytes每一步产生的字节数

在这里插入图片描述
核心就是cost

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
就能看到这些参数
cost是3
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
一个对表扫描,一个堆索引扫描
在这里插入图片描述
在这里插入图片描述

like会处罚全表的扫描
在这里插入图片描述
rownum伪列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
rowID是oracle自动搞的,跟我们无关的
在这里插入图片描述
明确指出了它在磁盘中的位置地址
所以速度最快

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
unique唯一
range范围
full全
fast full快速
skip跳跃

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
排序
在这里插入图片描述
不排序——速度快
在这里插入图片描述
在这里插入图片描述
优化啥?
优化sql语句,这样让你写代码高效
但是这是针对测开或者研发要干的事情
考公之后,网警只需要用oracle数据库查数据,所以不需要搞这些优化,只用而不设计

在这里插入图片描述
RBO有局限,不玩它
没人会这些细则
烦死人

我们要的是简单直接开发

在这里插入图片描述
loss最低优化器,这是深度学习机器学习玩的事情

比如

在这里插入图片描述

 select * from employees;

在这里插入图片描述
这句话,就是全表访问,cost是3
看看你能否把条件这些优化一下,降低cost
优化sql代码

现在的方案已经是最好的方案,你要觉得不咋地,那就继续优化
在这里插入图片描述

 select * from employees where employee_id=100;

在这里插入图片描述
先找rowID,再去找表数据,代价很低

SQL> desc employees;
Name           Type         Nullable Default Comments                                                                                                                                                                                  
-------------- ------------ -------- ------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
EMPLOYEE_ID    NUMBER(6)                     Primary key of employees table.                                                                                                                                                           
FIRST_NAME     VARCHAR2(20) Y                First name of the employee. A not null column.                                                                                                                                            
LAST_NAME      VARCHAR2(25)                  Last name of the employee. A not null column.                                                                                                                                             
EMAIL          VARCHAR2(25)                  Email id of the employee                                                                                                                                                                  
PHONE_NUMBER   VARCHAR2(20) Y                Phone number of the employee; includes country code and area code                                                                                                                         
HIRE_DATE      DATE                          Date when the employee started on this job. A not null column.                                                                                                                            
JOB_ID         VARCHAR2(10)                  Current job of the employee; foreign key to job_id column of the
jobs table. A not null column.                                                                                            
SALARY         NUMBER(8,2)  Y                Monthly salary of the employee. Must be greater
than zero (enforced by constraint emp_salary_min)                                                                                          
COMMISSION_PCT NUMBER(2,2)  Y                Commission percentage of the employee; Only employees in sales
department elgible for commission percentage                                                                                
MANAGER_ID     NUMBER(6)    Y                Manager id of the employee; has same domain as manager_id in
departments table. Foreign key to employee_id column of employees table.
(useful for reflexive joins and CONNECT BY query) 
DEPARTMENT_ID  NUMBER(4)    Y                Department id where employee works; foreign key to department_id
column of the departments table 

带主键的查询,primary key

在这里插入图片描述

在这里插入图片描述

SQL> select * from employees e where e.last_name='Taylor';

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
        176 Jonathon             Taylor                    JTAYLOR                   011.44.1644.429265   2006/3/24   SA_REP        8600.00           0.20        149            80
        180 Winston              Taylor                    WTAYLOR                   650.507.9876         2006/1/24   SH_CLERK      3200.00                       120            50

现在还是走索引了
我们去把索引表删除
在这里插入图片描述
在这里插入图片描述

把lastname的索引删除

在这里插入图片描述
你再去索引,竟然是全表索引
恐怖
说明索引很重啰!!!

在这里插入图片描述

在这里插入图片描述
like一定是全表
恐怖的

select * from employees e where e.last_name like '%a%';

我们去给lastnmae创建索引

SQL> create index emp_name on employees(last_name)
  2  ;

Index created


SQL> select * from employees e where e.last_name like '%a%';

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
        101 Neena                Kochhar                   NKOCHHAR                  515.123.4568         2005/9/21   AD_VP        17000.00                       100            90

它会跳过索引的

select * from employees e where e.last_name like '%a%';

在这里插入图片描述
如果不是like,其他的不会跳过索引

SQL> select * from employees e where e.last_name='Taylor';

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
        176 Jonathon             Taylor                    JTAYLOR                   011.44.1644.429265   2006/3/24   SA_REP        8600.00           0.20        149            80
        180 Winston              Taylor                    WTAYLOR                   650.507.9876         2006/1/24   SH_CLERK      3200.00                       120            50

SQL> select * from employees e where e.last_name='Taylor';

在这里插入图片描述
走索引轻松点

在这里插入图片描述
在这里插入图片描述
现在表格没有salary的索引
在这里插入图片描述
依然是全表索引
那我们建立一个索引看看

SQL> create index emp_sal on employees(salary);

Index created


SQL> select e.salary from employees e where e.salary=10000;

在这里插入图片描述
代价又降下来了
所以最好有索引
美滋滋

把它改为不等呢

在这里插入图片描述

 select e.salary from employees e where e.salary!=10000;

貌似现在不等号,超级快,但是它走的是全表索引
不走索引
在这里插入图片描述

select e.salary from employees e where e.salary<10000;

小于走索引
大于呢?

在这里插入图片描述

select e.salary from employees e where e.salary>10000;

也是走索引的
跟之前的版本可能不同
现在这个OK的

唯独那个不等于骚

在这里插入图片描述

select * from employees e,departments d where e.department_id=d.department_id;

在这里插入图片描述
因为department_id是主键,所以要全表扫描
看看employees表中谁与这个id相等,这是外键
然后执行hash 链接

既然是多表联合搞,自然速度慢,代价高

在这里插入图片描述
看看

select * from employees e where e.department_id in(select d.department_id from departments d);

在这里插入图片描述
子查询带来的代价低
性能好多了
所以等值连接不咋地啊
子查询本来括号里面优先执行一个查询速度快
然后外查询也快
这种代价带来的提升很牛逼
所以你写代码,不要写等值查询,而且子查询的直觉更舒服

在这里插入图片描述
现实所有雇员
左外为employees表

 select * from employees e left outer join departments d on e.department_id = d.department_id;

在这里插入图片描述
外连接老高了
和等值连接一样

当前语句执行效率一般

其他的表可能不一定
在这里插入图片描述
右外连接

 select * from employees e right outer join departments d on e.department_id = d.department_id;

在这里插入图片描述
也很复杂

都是全表扫描


总结

提示:重要经验:

1)
2)学好oracle,即使经济寒冬,整个测开offer绝对不是问题!同时也是你考公网络警察的必经之路。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值