oracle 查看执行计划查看smith上司在哪个城市工作

用户名:韩立伟
文章数:292
评论数:69
访问量:301823
注册日期:
阅读量:1297
阅读量:3317
阅读量:459055
阅读量:1143570
51CTO推荐博文
Oracle使用了一个复杂的自平衡B-tree结构。通常,通过索引查询数据比全表扫描要快。当 Oracle找出执行查询和Update语句的最好路径时,Oracle优化器将使用索引。同样在联结多个表时使用索引也能够提高效率。另一个使用索引的好处是,他提供了主键(primary key)的唯一性验证。那些LONG或LONG RAW数据类型, 您能够索引几乎任何的列。通常, 在大型表中使用索引特别有效. 当然,您也会发现, 在扫描小表时,使用索引同样能提高效率。  虽然使用索引能得到查询效率的提高,但是我们也必须注意到他的代价。索引需要空间来,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改。这意味着每条记录的INSERT,DELETE ,UPDATE将为此多付出4、5次的I/O 。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。定期的重构索引是有必要的:ALTER INDEX
REBUILD   用Oracle Exists替换DISTINCT:  当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般能够考虑用Oracle EXIST替换,Oracle Exists使查询更为迅速,因为RDBMS核心将在子查询的条件一旦满足后,立即返回结果。例子:SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE Exists ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); ◆SQL语句用大写的;因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。◆在Java代码中尽量少用连接符“+”连接字符串。◆避免在索引列上使用NOT通常,我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响。◆当Oracle“碰到”NOT,他就会停止使用索引转而执行全表扫描。 ◆避免在索引列上使用计算。WHERE子句中,假如索引列是函数的一部分。优化器将不使用索引而使用全表扫描。==============================================================================================================================================================================*
二:exists的用法:*//*1.列出至少有一个员工的所有部门*/select dname from dept where deptno in(select deptno from emp);select dname from dept a where exists(select 1 from emp b where b.deptno = a.deptno);/*
如果emp表的数据量远大于dept的数据量时,第二条SQL的效率比较高。
如果dept的数据量远大于emp的数据量时,第一条SQL的效率比较高。
说明:通过使用exists,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。
Oracle在执行in子查询时,首先执行子查询,并将获得的结果列表房子啊一个加了索引的临时表中。
在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。
这也就是使用exists比使用in通常查询速度快的原因。*//*2.列出薪金比“SMITH”多的所有员工*/select ename from emp where sal & (select sal from emp where ename = 'SMITH');select * from emp a where exists(select null from emp b where b.sal & a.sal and b.ename = 'SMITH');/*3.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号*/select e.ename from emp e where e.deptno = (select d.deptno from dept d where d.dname = 'SALES');select ename from emp a where exists(select 1 from dept b where a.deptno = b.deptno and b.dname = 'SALES');/*4.列出与“SCOTT”从事相同工作的所有员工*/select ename from emp where job = (select job from emp where ename = 'SCOTT');select ename from emp a where exists(select 1 from emp b where b.job = a.job and b.ename = 'SCOTT');
了这篇文章
类别:┆阅读(0)┆评论(0)Oracle发布Smith、Crashcart、Railcar三大开源容器工具集
  作者|Daniel Bryant
  译者|张卫滨
Oracle 发布了三个开源的容器工具集,包括:
Smith,遵循开放容器计划(Open Container Initiative,OCI)镜像规范的容器构造器,它能创建只包含可执行内容及其依赖的“微容器(microcontainer)”;
Crashcart,微容器调试工具,它允许运维人员将 Linux 二进制文件的镜像旁加载(sideload)到已有的容器中;
Railcar,基于 Rust 的容器运行环境,它实现了 OCI 运行时规范。
Vish Abrams 在 Oracle 开发人员博客的一篇文章上写道,Oracle 目前正在使用容器运行其云服务的很多组件。在开发和运维生产环境的这些容器时,他们学到了很多的经验,并相应地创建了一些工具,现在它们基于 Universal Permissive Licence 1.0 和 Apache License 2.0 双重协议进行了开源,代码可以从 GitHub 上得到。
作为发布这些工具的前奏,Abrams 在 Oracle 开发人员博客上还写过一篇额外的文章,名为“ Microcontainer Manifesto 以及完成任务的合适工具”,他认为容器的标准构建流程“对于开发人员非常理想,但是所形成的容器镜像使运维人员的工作非常困难”。
当 Oracle 两年前开始在容器技术方面进行投资时,他们定义了提升运行时容器“稳定性和安全性”的核心目标。尽管这是 Oracle 第一次官方宣布其容器技术,但是博客中提到自从这项工作开展以来,他们容器实现的稳定性和安全性得到了大幅度的提升。
Abrams 讨论了 Docker 容器在构建时将整个 Linux 操作系统(OS)放到容器镜像中所带来的问题。具体来讲,这会导致:
较大的镜像,变成这么庞大的镜像只是为了引入必要的层,使其变得可管理;权限封装——让应用运行在整个 Linux 用户空间中,这样会带来潜在攻击的风险;
漏洞管理——标准的构建流程让我们很难确定某个容器是否需要升级,因为容器实际使用的依赖文件难以确定。
需要注意的是,这里面所述的很多问题在现有的容器系统中已经解决了,比如使用特定 OS 的容器以及 scratch 容器;启用用户命名空间(User Namespace)以及 Linux 核心安全模块,比如 AppArmor;对容器镜像使用静态漏洞扫描器进行安全扫描,比如使用 CoreOS 的 Clair。
Oracle 为了解决在生产环境下所面临的问题,定义了名为微容器的概念(Iron.io 和 JBoss 业已使用过这个术语,不要与其混淆)。具体来讲,微容器:
只包含一个可执行文件及其依赖,没有 shell 和 init 进程
使用只读的 root 文件系统运行,没有分层和 Overlayfs(写入是隔离的,通过卷 mount 来进行处理)
所有的临时文件放在 /run 中,所有的持久化写入(日志文件和数据文件)放到 /write 中
需要针对每个容器修改的配置文件放到 /read 中,它可以通过卷 mount 或 Kubernetes configmap 来修改
没有用户和组文件系统所有权的功能——所有的内容都归一个用户拥有和读取
没有文件系统时间戳(timestamp)和功能(capabilities)
可以重复生成,每次都会生成相同的镜像
能够部署到不同的节点上,没有特定的镜像仓库的概念。
为了简化微容器的构建,Oracle 发布了 Smith,这是一个使用 Golang 编写的容器构建工具。这个工具可以通过 yum 仓库和(可选)RPM 文件来构建微容器。
另外,它还可以“微化(micro-ize)”已有的 Docker 容器,在开发阶段,开发人员能够使用非常友好的 Docker 工具来构建容器,而在生产部署的时候,Smith 能够将这个容器转换为微容器。Smith 按照标准 OCI 格式来构建镜像,但是它也可以通过 Docker 仓库上传和下载镜像。
微容器在针对生产环境的使用执行完微小化操作之后,对运维人员来说诊断和修复问题会变得很有挑战性,这主要是因为缺少 OS 工具。大多数的调试可以通过宿主机器完成,但有时需要以容器的视角来查看文件系统。
针对这种使用场景,Oracle 创建了 Crashcart。Crashcart 允许旁加载(side-loading)一组 Linux 二进制文件到正在运行的容器中,这样做的目的主要是探查和调试。关于旁加载二进制文件为何如此困难,以及 Crashcart 如何克服这些困难的,可以参考"Hardcore Container Debugging"这篇博客文章。
Oracle 发布的第三个工具是 Railcar,基于 Rust 的 OCI 运行时规范实现。它非常类似于参考实现 runc,但是它完全是使用 Rust 实现的,为了“内存安全,避免垃圾收集或多线程带来的损耗”。
Abrams 指出尽管 Go 在构建系统工具和 CLI 方面很有用,但是“Go 对于容器运行时来说却并不是好的可选语言”,其中的问题包括与命名空间的交互(在最近的 Weaveworks 博客文章上有所提及)。关于 Railcar 开发的更多信息可以参见 Oracle 开发人员博客"使用 Rust 构建容器运行时环境"。
这些工具发布的更多信息可以参考 Oracle 开发人员博客和 Oracle 的 GitHub 账号。
查看英文原文:Oracle Releases Open Source Container Utilities, Including A New Container Runtime Written in Rust
链接:q.com/news/2017/07/oracle-container-utilities
  今日荐文
  Oracle 数据库掌门人 Andy 的数据库云技术应用之道
  想转行学 Oracle & MySQL 数据库,却不知如何下手?StuQ 特邀了搜狐畅游 DBA 、DBAplus 社群联合创始人、Oracle 10g OCM,MySQL OCP 认证的杨建荣老师,于 7 月 27 日晚(周四)20:00-21:00 为大家带来一场原价 99 元,现在 0 元的公开课,1 小时为你拨开 DBA 职业生涯迷雾,助你成为数据团队中的“特种兵”!,赶快添加小助手,获取免费听课地址吧!
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点1.1简单查询语句
在scott用户下有几张表,先了解下一下这几张表在作用。
1雇员表(emp)
2部门表(dept)
3工资等级表(SALGRADE)
4奖金表(BONUS)
简单查询语句语法格式:
SELECT *| 具体的别 别名
FROM 表名称;
例如只查询emp表雇员的编号,姓名,工作:
select empno,ename,
查询的时候可以指定查询的返回列的名称,即为一个列取一个别名:
select empno 编号,ename 姓名,job 工作
查询工作:
发现存在重复值,可以通过DISTINCT消除所有的重复列:
SELECT {DISTINCT} *|具体的列 别名
FROM 表名称
在Oracle中提供字符串连接操作,使用“||”表示,所有的其他信息可以使用“’”括起来。
现在要求查询雇员的编号,姓名,工作,但是显示的格式:
编号是:7369的雇员,姓名是:SMITH,工作是:CLEKE
SQL& select '编号是:'||empno ||'的雇员,姓名是:'||ename||',工作是:'||
在查询中可以使用四则运算功能,例如求出每个雇员的姓名及年薪。
SQL& select ename ,sal*12
1.2限定查询(WHERE)
限定查询的语法:
SELECT {DISTINCT} *|具体列 别名
FROM 表名称
{WHERE 条件(s)}
例:查询出所有工资大于1500的所有雇员信息:
select * from emp where sal&1500;
例:查询每个月可以得到奖金的雇员信息
为空:IS NULL;不为空:IS NOT NULL。
select * from emp wh
例:查询工资大于1500,同时可以拿到奖金的雇员信息:
两个条件同时满足,可以用“and”连接。
SQL& select * from emp where sal&1500
例:查询工资大于1500,或者可以拿到奖金的雇员信息:
两个条件满足一个,可以用“or”进行连接。
select * from emp where sal&1500
例:查询工资不大于1500,或者拿不到奖金的雇员信息:
用NOT取反操作
SQL& select * from emp where not(sal&1500 and comm is not null);
例:查询工资大于1500,不大于3000的雇员信息
字段 BETWEEN 最小值 AND 最大值
SQL& select * from emp where sal between 1500 and 3000;
例:查询1981年雇佣的全部雇佣:
日期表示的时候要加“'”
SQL& select * from emp where hiredate between '01-1月 -81' and '30-12月 -81';
例:查询名字叫SMITH的雇员
SQL& select * from emp where ename = 'SMITH';
例:查询雇员编号为、7521的雇员信息:
SQL& select * from emp where empno =7369 or empno=7499 or empno=7521;
指定从查询范围,可以用IN操作符完成,语法格式:
字段 IN(值1,值2,…,值3)
不在指定范围,可以用NOT IN 操作符完成
字段 NOT IN(值1,值2,…,值3)
注意:在使用NOT IN进行范围判断的时候,如果范围里面包含有null,那么不会返回任何结果。
以上查询语句可以写成:
select * from emp where empno in(21);
IN中指定了表中范围外的内容,不影响程序运行。
模糊查询:LIKE
SQL使用LIKE语句完成模糊查询,在LIKE语句中主要使用以下两种通配符:
l& “%”:可以匹配任意长度的内容;
l& “-”:可以匹配一个长度的内容。
例:查询所有雇员姓名中第二个字母包含“M”的雇员信息
SQL& select * from emp where ename like '_M%';
例:查询所有雇员姓名中包含“M”的雇员信息
SQL& select * from emp where ename like '%M%';
例:查询1981年雇佣的雇员信息
select * from emp where hiredate like '%81';
在操作条件中还可以使用&、&=、 =、 &、 &=。
不等于符号:SQL中有两种形式“&&”、“!=”。
1.3对结果进行排序(ORDER BY)
ORDER BY排序语法格式:
SELECT {DISTINCET} *|具体列 别名
FROM 表名称
{WHERE 条件(s)}
{ORDER BY 排序的字段1,排序的字段2, ASC|DESC} -&ASC升序,DESC降序,默认按升序排
例:要求按雇员的工作由低到高排序
SQL& select * from
例:要求查询出10部门的所有雇员信息,按工资有高到低排序,如果工资相等,按雇佣日期由早到晚排序。
SQL& select * from emp where deptno=10 order by sal desc,
1.4单行函数
单行函数语法:
Function_name(colum|expression,[arg1,arg2,…,])
参数说明:
l& Function_name:函数名称;
l& Column:数据库列名;
l& Expression:字符串与计算表达式;
l& Arg:函数中使用的参数
单行函数分类:
l& 字符函数:接受字符输入并返回字符或数值;
l& 数值函数:接受数值输入并返回数值;
l& 日期函数:对日期值数据进行操作;
l& 转换函数:从一种数据类型转换为另一种数据类型;
l& 通用函数:NVL函数、DECODE函数。
1.4.1字符函数
可以将大写字符变为小写,还可以求出字符的长度。
&&&&&&&& 在Oracle中所有的函数如果要想进行验证,也必须编写SQL语句。为了方便用户进行一些验证或者一些不需要查询表的查询操作,专门提供了一个dual的虚拟表。
例:将小写变为大写
SQL& select upper('smith')
例:一般用户在查询一个人姓名的时候,可能考虑到这个人的姓名是大写字母还是小写字母呢,此时可以使用upper函数完成。
SQL& select * from emp where ename = upper('smith');
在Oracle数据库里面本身数据是区分大小写的,但是在实际的项目开发中有许多代码本身的不区分大小写关系的,所以用户进行信息查询的时候也往往不会考虑到字母的大小写问题。
例:由用户输入要查询的雇员姓名,而后显示雇员的完整信息
l& 在Oracle中如果要想实现数据的输入操作,可以使用代替变量的方式完成,格式“&标记”
select * from emp where ename=upper('&inputname');
例:使用lower()函数将字符串变为小写
SQL& select lower('HELLO')
例:用initcap()函数将单词第一个字母变成大写,其他变成小写。
SQL& select initcap('HELLO')
例:将雇员表中雇员姓名变为首字母大写。
SQL& select initcap(ename)
例:字符串连接除了可以用“||”外,还可以用CONCAT()函数进行连接操作。
SQL& select concat('hello','word')
l& 字符串截取:substr(str,offset,len);
l& 字符串长度:length(str);
l& 内容替换:replace(str,c1,c2);& 字符串str中将c1变为c2
SQL& select substr('hello',1,4), length('hello'), replace('hello','h','t')
面试题:Oracle中substr()函数截取点是从0还是从1开始?
|-从0和1都可以,因为Oracle比较智能。
例:要求显示所有雇员姓名和姓名后三个字符
SQL& select ename,substr(ename,length(ename)-2)
实际上substr()函数中提供了一种可以倒着截取的方式,只要输入的位置是负数就表示倒着进行。
SQL& select ename,substr(ename,-3,3)
1.4.2数值函数
四舍五入:ROUND();
截断小数位:TRUNC();
取余(取模):MOD();
例:执行四舍五入。
SQL& select round(2.31323)
例:对整数进行四舍五入进位。
SQL& select round(324.32,-2)
例:保留2位小数。
SQL& select trunc(32.23232,2)
TRUNC()与ROUND()不同的是,在TRUNC中,不会保留任何的小数,而且小数点不会进行四舍五入操作。
SQL& select trunc(32.427,2)
SQL& select trunc(32.427)
例:使用负数表示位数。
SQL& select trunc(372.827,-2)
例:使用MOD()函数取余操作
SQL& select mod(10,3)
1.4.3日期函数
日期的加减操作规律:
l& 日期-数字=日期
l& 日期+数字=日期
l& 日期-日期=数字(天数)
例:显示10部门雇员进入公司的星期数。
|-获取当前的时间:SYSDATE
SQL& select round((sysdate-hiredate )/7)
l& MONTHS_BETWEEN(DATE1,DATE2):求出所给日期范围的月数;
l& ADD_MONTHS(date,months):在给定日期上加上指定月数,求出之后的日期
l& NEXT_DAY(date,’星期几’):下一个的星期几是那个日期
l& LAST_DAY(date);求出所给日期的所在月份的最后一天日期
验证MONTHS_BETWEEN(DATE1,DATE2)
SQL& select ename,months_between(sysdate,hiredate)
验证ADD_MONTHS(date,months)
SQL& select add_months(sysdate,4)
验证NEXT_DAY(date,’星期几’)
SQL& select next_day(sysdate,'星期一')
验证LAST_DAY(date)
SQL& select last_day(sysdate)
1.4.4转换函数
l& TO_CHAR(日期,通配符):日期转换成字符串
l& TO_NUMBER():字符串转化成数字
l& TO_DATE():字符串转换成日期
(1)TO_CHAR()函数
日期年、月、日拆分的通配符:
l& 年:’y’,年是四位的数字,可以使用’yyyy’表示;
l& 月:’m’,月是两位的数字,可以使用’mm’表示;
l& 日:’d’,日是两位的数字,可以使用’dd’表示;
l& 年-月-日:’yyyy-mm-dd’
例:对雇员表的日期进行拆分
SQL& select to_char(hiredate,'yyyy')year,to_char(hiredate,'mm') month,to_char(hiredate,'dd')
SQL& select ename, to_char(hiredate,'yyyy-mm-dd')
从运行结果可以看出日期一位数的时候会在前面补0,如果不想要0的话,可以用fm去掉这些0。
SQL& select ename, to_char(hiredate,'fmyyyy-mm-dd')
TO_CHAR()函数还可以用在数字中,一般中国使用“,”分割比较长的数据,可以使用to_char()进行格式化。
SQL& select ename,to_char(sal,'99,999')
可以使用以下两种符号表示不同金额:
l& $:表示美元
l& L:表示Local的缩写。以本地的语言进行金额的显示
SQL& select ename,to_char(sal,'$99,999')
(2)TO_NUMBER()函数
将字符串转换成数字
SQL& select to_number('123')+to_number('234')
(3)TO_DATE()函数
&&&&&&&& 将字符串转换成DATE型数据。
SQL& select to_date('','yyyy-mm-dd')
1.4.5通用函数
(1)NVL()函数
例:求出每个雇员的年薪(sal+comm)*12。
SQL& select ename ,(sal+comm)*12
&&&&&&&& 造成这样的结果是因为有些雇员的奖金为NULL,NULL值计算之后结果还是NULL。遇到这种情况就可以使用NVL()函数,可以将一个指定的NULL值变为指定的内容。
SQL& select empno,ename,nvl(comm,0),(sal+nvl(comm,0))*12
(2)DECODE()函数
&&&&&&&& DECODE()函数在面试中最有可能问到的问题,类似于IF…ELSEIF…ELSE语句。
DECODE(col/expression,search1,result1[,search2,result2,…][,default])
l& Col/expression:为列名或者表达式
l& Search1、search2…searchi:用于比较的条件
l& Result1、result2…resulti:为返回值
如果col/expression与search相比较,结果相同的话,返回result,如果没有与col/expression相同的结果,返回默认值default。
SQL& select decode(1,1,'内容是1',2,'内容是2','没有匹配的')
结果是:内容是1
SQL& select decode(5,1,'内容是1',2,'内容是2','没有匹配的')
结果是:没有匹配的
例:雇员的工作:
|-CLERK:业务员
|-SALESMAN:销售员
|-MANAGER:经理
|-ANALYST:分析员
|-PRESIDENT:总裁
现要求查询雇员的编号,姓名,雇佣日期及工作,将工作替换成以上内容。
SQL& select empno,ename,hiredate,decode(job,'CLERK','业务员','SALESMAN','销售员','MANAGER','经理', 'ANALYST','分析员','PRESIDENT','总裁')
阅读(...) 评论()}

我要回帖

更多关于 oracle查看字符集 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信