
Oracle
孟德三笑
原谅我这一生不羁放纵爱自由
展开
-
Oracle优化之直方图
当数据列基数较低的时候 ,该列数据分布就可能不均衡。这就导致在查询该列的时候,最优的结果可能走索引,也可能走全表扫描。但是如果我们没有对该列收集直方图统计信息,那么基于成本的优化器(CBO)就会认为该列数据分布是均衡的,导致没有按最优的执行计划来查询。这是因为执行计划里的rows是假的,是根据统计信息和一些数学公式计算出来的。而收集直方图信息,就是帮助执行计划计算 得到更加精准的rows。...原创 2020-10-04 15:59:19 · 260 阅读 · 1 评论 -
oracle优化之选择性
基数与表的总行数的比值就是选择性当我们学习了基数后,可以得出一个大概的结论:基数比较小时,查询不走索引,基数比较大时,查询走索引。但是这样太笼统了,什么情况下基数算大,什么情况下算小呢。比如一个字段的基数是10000,应该比较大了吧,但是这张表本身有100亿条数据。相形之下,就不那么大了。所以单独看列的基数就没有什么意义了,这就引入了列的选择性。当一个列的选择性大于20%时,说明这个列的数据分布就比较均衡了。这时如果在where子句中对这个字段做条件筛选,就应该创建索引。当然,如果表的数据量比较小的原创 2020-09-23 14:40:48 · 495 阅读 · 0 评论 -
oracle优化之基数
基数指的是一个字段中不重复值的个数。比如性别列,它的值有男和女两种情况,所以它的基数是2以scott账户的emp表为例,执行以下sqlselect count(1) as num,count(distinct job) as jobnum,count(distinct deptno) from emp由结果可以看出,emp表的行数为14,job列的基数为5,deptno列的基数为3当字段的基数越大时,该列数据的分布可能就越均衡。字段的基数越小时,该列数据的分布可能就越不均衡。举个原创 2020-09-22 17:19:04 · 700 阅读 · 0 评论 -
一条普通的sql查询探索Oracle物理体系结构
Oracle体系结构—物理体系结构首先发起一条sql指令select object_name from t where object_id=29第一步该sql指令先进入1区PGA,该指令在这里主要完成了两件事情:1)连接信息的保存2)权限的保存只要session不断开连接,下次系统不用再去硬盘中读取数据,而直接从PGA内存中获取。此外,该sql还会立即匹配成一条唯...原创 2019-03-02 22:22:44 · 228 阅读 · 0 评论 -
Oracle体系结构—物理体系结构
Oracle由实例和数据库组成,其物理体系结构图如下:一区:PGA (Program Global Area)PGA是一块开辟出来的私有不共享的内存区,用户对数据库发起的无论查询还是更新的任何操作,都是在PGA先预处理,然后接下来才进入实例区域,由SGA和系列后台进程共同完成用户发起的请求。PGA的预处理作用:1)保存用户的连接信息,如会话属性、绑定变量等2)保存...原创 2019-02-19 15:49:22 · 841 阅读 · 0 评论 -
存储过程创建表
判断当前数据库是否有表CAP_LOG_变量,如果有,删除后新建,如果没有直接新建create or replace procedure pro_createtable(filename varchar2)authid current_user is --授予调用者在存储过程中拥有其角色权限num number;begin select count(1) into num f...原创 2018-10-11 16:57:49 · 8113 阅读 · 0 评论 -
简单的使用游标返回Oracle存储过程结果集示例
示例基于student表:创建存储过程:create or replace procedure read_stu(t out SYS_REFCURSOR)isbeginopen t for select sid,sname from student;end;使用存储过程:declare t sys_refcursor;s student%rowtype;b...原创 2018-09-26 17:39:59 · 4014 阅读 · 1 评论 -
Oracle速查手册
create user [用户名] identified by [密码];--创建用户 --如何修改用户密码: alter user [用户名] identified by [新密码]2.grant connect to [用户名]--赋予用户登录权限 grant create session to [用户名]3.grant resource to [用户名] --...原创 2018-09-26 15:07:40 · 368 阅读 · 0 评论 -
Oracle求连续区间内的最大最小值
现在有一组数据记录了NBA球队每年的夺冠队伍,如下:要求求出连续夺冠的队伍和连续年月,效果如下:首先要判断一个队是否连续夺冠,我们可以通过lag函数来获取字段的上一个值,就比较容易判断了。然后给判断赋值,连续的为0,不连续的 为1。然后使用累加为后续的分组作准备:最后就是很基础的分组求最大最小值过程了,就不再赘述了。最终sql如下:s原创 2017-10-31 20:57:22 · 3515 阅读 · 1 评论 -
Oracle对空值的排序处理
在对Oracle的结果集进行排序的时候,如果排序的列存在空值的情况,那么怎么在不改变原来的顺序(升序或降序)的情况下,如何控制空值最先显示或是最后显示呢?Oracle提供了一个很好的方法。select ename, commfrom emporder by comm以上语句的查询结果是:如果想把空值放在最前面,可以加上nulls first:selec原创 2017-06-15 09:43:29 · 5633 阅读 · 0 评论 -
Oracle不引用对象名访问对象的表
在Oracle中,一个用户想访问其他用户的表时,首先要获得访问的权限,然后可以通过用户.表名的方式访问该表。比如我有一个新创建的用户,axing。若想访问scott的数据表,必须先授权,在scott用户下执行以下语句:grant select any table to axing;然后可以在axing用户下查询:select * from scott.emp每次访问的原创 2017-06-19 16:32:59 · 473 阅读 · 1 评论 -
数据查询使用数字代替字段排序
数据库查询的时候一般会对查询结果做一个排序,以方便浏览查看。有时候一些字段比较复杂,为了追求速度,可以使用数字来代替字段,例如select a,b,c,d from table order by 1,2,3,41,2,3,4分别对应上面的a,b,c,d。原创 2017-03-14 14:44:32 · 576 阅读 · 0 评论 -
Oracle缺失左括号错误
Oracle在创建表的时候,报了一个错误:[Err] ORA-00906: missing left parenthesis。以下是创建表的源代码:CREATE TABLE TB_SALES_PO_FR ("ID" NUMBER NOT NULL ,"BUSINESSID" VARCHAR2 NULL ,"BUSINESS" VARCHAR2(50) NULL ,"WORKCOD原创 2017-03-30 14:23:46 · 16225 阅读 · 2 评论 -
sql语句的执行顺序
理解sql语句的执行顺序对优化sql非常重要,那么sql语句的执行顺序是怎样的呢,以一条简单的的语句做分析: 这一条语句包含我们经常用到的一些关键字,select,from,where,group by,order by,它的执行顺序如下:先执行from关键字后面的语句,明确数据的来源,它是从哪张表取来的。接着执行where关键字后面的语句,对数据进行筛选。再接原创 2017-01-10 11:09:04 · 36210 阅读 · 10 评论 -
左连接右连接傻傻分不清
Oracle数据库内置了几张练习表,笔者这里用到了emp和dept。表里的数据如下所示: 首先,笔者先用ANSI SQL连接格式分别进行左右连接查询,结果如下: 对于这个结果,只要理解左右连接的原理的,都能明白。所以接下来笔者要说的是Oracle特有的连接方式:select * from emp,dept whe原创 2016-12-23 10:40:40 · 541 阅读 · 0 评论 -
子查询作为数据源时是否需要表别名
在sqlserver2008中,把子查询做为数据源时,如果没有表别名,将会提示错误,如下: 如果添加了表别名,如加了个“a”,则正确查询: 而在Oracle中,不添加表别名也不会出错,如下:原创 2016-12-16 17:13:12 · 6296 阅读 · 0 评论 -
Oracle创建触发器的时候因为大小写编译出错
创建表的时候id写成了小写,如图:创建触发器的时候使用了大写,如图:结果会报一个错误:success with compilation error (创建成功但编译出错)如图:一开始以为Oracle是忽略大小写问题的,没往这方面想,被卡住了很久。结果最后只需把他们都小写或都大写就没问题了。原创 2016-10-20 20:51:02 · 1843 阅读 · 1 评论 -
报表查询数据时select*查到数据select具体字段查不到
首先是select * 语句:可以看到是可以查寻的,(该表尚未填入数据,是空表)然后select具体字段:可以看到,出现了空指针异常,在页面上查看则提示“name”标识符无效,已经试过多个字段,且大小写均试,但都是提示空指针异常。 最后我查询了一下数据库设计,问题就出在这里,我设计数据库的时候,字段名用的都是小写,因此查不到,把字段名全换成大写之后就没问题了。原创 2016-10-21 11:19:52 · 4822 阅读 · 0 评论