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,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。