oracle创建视图和索引,oracle视图、同义词和索引

2024-01-16 23:10

本文主要是介绍oracle创建视图和索引,oracle视图、同义词和索引,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.视图

视图就是封装了一条复杂查询的语句,是一个虚表。

CREATE [OR REPLACE] [FORCE] VIEWview_nameASsubquery[WITH CHECK OPTION]

[WITH READ ONLY]

OR REPLACE :若所创建的试图已经存在,ORACLE 自动重建该视图;

FORCE :不管基表是否存在 ORACLE 都会自动创建该视图(错误视图);

subquery :一条完整的 SELECT 语句,可以在该语句中定义别名;

WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;

WITH READ ONLY :该视图上不能进行任何 DML 操作(只读视图)。

---视图的概念:视图就是提供一个查询的窗口,所有数据来自于原表。

---查询语句创建表

create table emp as select * fromscott.emp;select * fromemp;---创建视图【必须有dba权限】

create view v_emp as select ename, job fromemp;---查询视图

select * fromv_emp;---修改视图[不推荐],原表的数据也会跟着改变

update v_emp set job='CLERK' where ename='ALLEN';commit;---创建只读视图

create view v_emp1 as select ename, job from emp with read only;

删除视图语法

DROP VIEW view_name

物化视图

视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。

每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。

物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。

创建物化视图语法:

CREATE METERIALIZED VIEWview_name[BUILD IMMEDIATE | BUILD DEFERRED]REFRESH[FAST|COMPLETE|FORCE]

[ON [COMMIT |DEMAND] | START WITH (start_time) NEXT(next_time)

]ASsubquery

BUILD IMMEDIATE 是在创建物化视图的时候就生成数据

BUILD DEFERRED 则在创建时不生成数据,以后根据需要再生成数据,默认为 BUILD IMMEDIATE。

刷新(REFRESH):指当基表发生了 DML 操作后,物化视图何时采用哪种方式和基表进行同步。

REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。

FAST 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。

COMPLETE 刷新对整个物化视图进行完全的刷新。

如果选择 FORCE 方式,则 Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式。FORCE 是默认的方式。

刷新的模式有两种:ON DEMAND 和 ON COMMIT。ON DEMAND 指需要手动刷新物化视图(默认)。ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。

如果创建物化视图设置不生成数据或者设置手动刷新,需要通过下面的语句(PL/SQL),刷新物化视图:

beginDBMS_MVIEW.refresh('物化视图名','C');end;

或者通过下面的命令手动刷新物化视图:

EXEC DBMS_MVIEW.refresh('物化视图名','C');

注意:此语句需要在命令窗口中执行。

DBMS_MVIEW.refresh 实际上是系统内置的存储过程

创建增量刷新的物化视图:

如果创建增量刷新的物化视图,必须首先创建物化视图日志,创建的物化视图日志默认名称为 MLOG$_表名称

create materialized view log on t_address withrowid;create materialized view log on t_area with rowid

表结构为:

82df6600274cefd2228527eae9f3cf2e.png

SNAPTIME$$:用于表示刷新时间。

DMLTYPE$$:用于表示 DML 操作类型,I 表示 INSERT,D 表示 DELETE,U 表示 UPDATE。

OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值

CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。

此列是 RAW 类型(二进制),其实 Oracle 采用的方式就是用每个 BIT 位去映射一个列。

插入操作显示为:FE, 删除显示为:OO 更新操作则根据更新字段的位置而显示不同的值。

当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。

创建物化视图,语句中必须有基表的 rowid,和上面创建视图日志的rowid对应,作为标识

create materialized viewmv_address

refresh fastas

selectad.rowid adrowid ,ar.rowid arrowid, ad.id,ad.name adname,ar.name ar_namefromt_address ad,t_area arwhere ad.areaid=ar.id;

二.同义词

同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的 SQL 语句复杂度。同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。

你可以创建公共同义词和私有同义词。其中,公共同义词属于 PUBLIC 特殊用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中,只允许特定用户或者有基对象访问权限的用户进行访问。

同义词本身不涉及安全,当你赋予一个同义词对象权限时,你实质上是在给同义词的基对象赋予权限,同义词只是基对象的一个别名。

创建与使用同义词:

语法:create [public] SYNONYM synooym for object;

其中 synonym 表示要创建的同义词的名称,object 表示表,视图,序列等我们要创建同义词的对象的名称。

1.私有同义词

--需求:为表 T_OWNERS 创建(私有)同义词 名称为 OWNERS

create synonym OWNERS forT_OWNERS;--使用同义词

select * from OWNERS;

2.公有同义词

--需求:为表 T_OWNERS 创建(公有)同义词 名称为 OWNERS2

create public synonym OWNERS2 forT_OWNERS;--以另外的用户登陆,也可以使用公有同义词

select * from OWNERS2;

三.索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。

索引的使用原则:

在大表上建立索引才有意义

在 where 子句后面或者是连接条件上的字段建立索引

表中数据修改频率高时不建议建立索引

--索引的概念:索引就是在表的列上构建一个二叉树----达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。---单列索引---创建单列索引

create index idx_ename onemp(ename);---单列索引触发规则,条件必须是索引列中的原始值。---单行函数、模糊查询,都会影响索引的触发。

select * from emp where ename='SCOTT'

---复合索引---创建复合索引

create index idx_enamejob onemp(ename, job);---复合索引中第一列为优先检索列---如果要触发复合索引,必须包含有优先检索列中的原始值。

select * from emp where ename='SCOTT' and job='xx';---触发复合索引

select * from emp where ename='SCOTT' or job='xx';---不触发索引

select * from emp where ename='SCOTT';---触发单列索引。

--创建唯一索引

create unique index 索引名称 on 表名(列名);

反向键索引:

应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。

c669194690849a4979dac91616ecdab6.png

语法:create index 索引名称 on 表名(列名) reverse;

位图索引:

使用场景:位图索引适合创建在低基数列(字段的值只有几个可选的值,比如性别字段的取值为男和女)上,

只有在 比如where sex="男" 这种等值比较查询时才会发挥作用,在 >,< 等范围查询时无效

位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射

优点:减少响应时间,节省空间占用

语法:create bitmap index 索引名称 on 表名(列名);

这篇关于oracle创建视图和索引,oracle视图、同义词和索引的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614221

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

数据视图(AngularJS)

<!DOCTYPE html><html ng-app="home.controller"><head><meta charset="utf-8"><title>数据视图</title><link href="page/common/css/bootstrap.min.css" rel="stylesheet"><script src="page/common/js/angular.js"></

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计