ORACLE数据库中权限和角色的全面解析

ORACLE数据库中权限和角色的全面解析,第1张

Oracle数据库是一种大型关系型的数据库 我们知道当使用一个数据库时 仅仅能够控制哪些人可以访问数据库 哪些人不能访问数据库是无法满足数据库访问控制的 DBA需要通过一种机制来限制用户可以做什么 不能做什么 这在Oracle中可以通过为用户设置权限来实现 权限就是用户可以执行某种 *** 作的权利 而角色是为了方便DBA管理权限而引入的一个概念 它实际上是一个命名的权限集合

权限

Oracle数据库有两种途径获得权限 它们分别为

① DBA直接向用户授予权限

② DBA将权限授予角色(一个命名的包含多个权限的集合) 然后再将角色授予一个或多个用户

使用角色能够更加方便和高效地对权限进行管理 所以DBA应该习惯于使用角色向用户进行授予权限 而不是直接向用户授予权限

Oracle中的权限可以分为两类

系统权限

对象权限

系统权限

系统权限是在数据库中执行某种 *** 作 或者针对某一类的对象执行某种 *** 作的权利 例如 在数据库中创建表空间的权利 或者在任何模式中创建表的权利 这些都属于系统权限 在Oracle i中一共提供了 多种权限

系统权限的权利很大 通常情况下

① 只有DBA才应当拥有alter database系统权限 该权限允许用户对数据库物理结构和可用性进行修改

② 应用程序开发者一般应该拥有Create Table Create View和Create Type等系统权限 用于创建支持前端的数据库模式对象

③ 普通用户一般只具有Create session系统权限(可以通过Connection角色获得) 只有Create Session系统权限的用户才能连接到数据库

④ 只有具有Grant Any PRivilege系统权限用户 或者获取了具有With Admin Option选项的系统权限的用户 才能够成为其它用户授予权限

对象权限

对象权限是针对某个特定的模式对象执行 *** 作的权利 只能针对模式对象来设置和管理对象权限

对于模式对象 表 视图 序列 存储过程 存储函数 包都可以对象设置权限 不同类型模式对象具有不同的对象权限 比如 表 视图等对象具有查询(Select) 修改(Update) 删除(Delete)等对象权限 而存储过程 存储函数等对象则具有执行(Execute)等对象权限

但是并不是所有的模式对象都可以设置对象权限 比如簇 索引 触发器以及数据库链接等模式就不具有对象权限 这些模式对象的访问控制是通过相应的系统权限来实现的 比如 要对索引进行修改 必须拥有Alter Any Index系统权限

用户自动拥有他的模式中所有对象的全部对象权限 他可以将这些对象权限授予其他的用户或角色 比如 Test 用户创建了一个表Table 在没有授权的情况下 用户Test 不能查询 修改 删除这个表 如果Test 将ETP表的Select对象权限授予了Test 则该用户就可以查询 Table 表了 如果在为其它用户授予对象权限时用了With Grant Option选项 被授予权限的用户还可以将这个权限在授予其他用户

角色

角色的概念

角色就是多个相关权限的命名集合 通过角色来进行对用户授予权限 可以大大简化DBA的工作量 比如 处于统一部门中的 多个用户都需要访问数据库中的一系列表 DBA可以将这些表的中合适的对象权限授予一个角色 然后在把这个角色授予这些用户 这样进行 *** 作要比为没有用户进行授权要便捷多了 而且要对这些用户的权限进行统一修改 只需要修改角色的权限即可

角色的优点

通过角色为用户授予权限 而不是直接向各个用户授权 具有以下优点

简化权限管理 DBA将用户群分类 然后为每一类用户创建角色 并将该角色授予这类用户所需要的权限 最后在将改角色授予该类中的各个用户 这样不仅简化了授权 *** 作 而且当这类用户的权限需求发生改变时 只需要把角色的权限进行改动 而不必修改每一位用户的权限

动态权限管理 角色可以被禁用或激活 当角色被禁止使用时 拥有该角色的用户不再拥有授予改角色的权限了 这样就可以对多个用户的权限进行动态控制了

灵活的编程能力 角色是存储在数据字典中的 并且可以为角色设置口令 这样就能够在应用程序中对角色进行控制 比如禁用或者激活等 *** 作

下面以Oracle i为例 给出具体的实现用户授权

( )设定各种角色 及其权限

CREATE ROLE checkerrole DENTIFIEDBYxm ;

CREATE ROLE defaultrole IDENTIFIEDBYdefaultrole;

GRANT SELECT UPDATE ON

account paytable TO checkerrole;

GRANT CONNECT TO defaultrole;

( )创建用户

CREATE USER xiaoli IDENTIFIEDBY xiaoli;

( )授权

GRANT checkerrole TO xiaoli;

GRANT defaultrole TO xiaoli;

( )设定用户缺省的角色

ALTER USER xiaoli DEFAULTROLE defaultrole;

( )注册过程

CONNECT xiaoli/xiaoli@oracle

此时用户只有其缺省角色的权限

( )激活角色

SET ROLE checkerrole IDENTIFIEDBY xm ;

— *** 作成功后 xiaoli拥有checkerrole的权限

lishixinzhi/Article/program/Oracle/201311/18359

导读:Oracle的后台运作原理是什么?我们的一条命令是如何被执行的?今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。

Select语句可以说是DBA和数据库开发者在工作中使用最多的语句之一,但这条语句是如何执行?在Oracle数据库中又是如何运作的呢今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。这对于我们之后的系统管理与故障排除非常有帮助。

第一步:客户端把语句发给服务器端执行

当我们在客户端执行select语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle客户端是不会做任何的 *** 作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对SQL语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。所以,由于所有的SQL语句都是服务器进程执行的,所以,有些人把服务器进程形象地比喻成客户端进程的“影子”。

第二步:语句解析

当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。

1 查询高速缓存。服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,刚好有其他人使用这个查询语句的话,则服务器进程就会直接执行这个SQL语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。

不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。

2 语句合法性检查。当在高速缓存中找不到对应的SQL语句时,则数据库服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行SQL他只是语法上的检查。

3 语言含义检查。若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。

所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。若能够掌握这个顺序的话,则在应用程序排错的时候,可以节省时间。

4 获得对象解析锁。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。对于加锁的原理与方法,我在其他文章中已经有专门叙述,在这里就略过不谈了。

5 数据访问权限的核对。当语法、语义通过检查之后,客户端还不一定能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。故,有时候我们查询数据的时候,辛辛苦苦地把SQL语句写好、编译通过,但是,最后系统返回个 “没有权限访问数据”的错误信息,让我们气半死。这在前端应用软件开发调试的过程中,可能会碰到。所以,要注意这个问题,数据库服务器进程先检查语法与语义,然后才会检查访问权限。

6 确定最佳执行计划。当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。

当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到数据高速缓存。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。

第三步:语句执行

语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。

这个语句执行也分两种情况。一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。

这里仍然要注意一点,就是Oracle数据库中,定义了很多种类的高速缓存。像上面所说的SQL语句缓存与现在讲的数据缓存。我们在学习数据库的时候,需要对这些缓存有一个清晰的认识,并了解各个种类缓存的作用。这对于我们后续数据库维护与数据库优化是非常有用的。

第四步:提取数据

当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。

从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:

一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。

二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。

数据量比较大的访问速度慢问题,就目前来说,我遇到的解决方法有一些,首先尽量不使用select ,因为数据库在进行查询时会把对应的列进行解析,会使得数据库的访问速度变慢,查询时应该选择需要的列;另外在查询时需要在关键列上建立索引,索引是提高访问数据库速度的最重要的手段,一般访问速度慢的问题中,90%可以使用建立索引来解决,具体怎么建立索引还请楼主自己查看相关资料;再一个就是及时对表进行数据分析,分析过的表能够自己选择合适的索引,使得查询性能在一定程度上得到提高(但是数据库自己选择的执行路径也不一定都是正确的,这一点需要具体问题具体分析)。

sql语句的大概意思是:

由表Student ,Class 中的ClassNo进行表关联,按表Class 中字段ClassNo,ClassName,Sex进行分组查询,最后将查询的ClassName,Sex,StudentNum的数据按升序排列出来。

他们已经说了相关的东西了

我再补充几点:

分成两类:加锁范围子句和加锁行为子句

加锁范围子句:

在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁 *** 作。默认情况下,不使用of子句表示在select所有的数据表中加锁

加锁行为子句:

当我们进行for update的 *** 作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

首先,对你的需求有点模糊,取消c_id的重复行,然后还显示c_id,s_id。上面两个SQL不知道是否满足你的需求,就比如select distinct c_id,s_id from xskc ,这条语句消除的是c_id和s_id同时一样的记录,所以单就c_id,还是会有重复的情况。SQL> desc dup Name Null Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(10)SQL> select from dup; ID NAME---------- ---------- 1 AAA 2 AAA 1 BBB 3 BBBSQL> select distinct id,name from dup; ID NAME---------- ---------- 1 AAA 1 BBB 2 AAA 3 BBBSQL> select distinct id from dup; ID---------- 1 2 3所以不管怎么样,如果你要显示c_id和s_id的话,c_id基本都可能重复,除非你还有其他的条件限制

1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col…) 删除索引:drop index idxname on tabname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select from table1 where field1 like ’%value1%’ (所有包含‘value1’这个模式的字符串)---like的语法很精妙,查资料! 排序:select from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1[separator] 11、说明:几个高级查询运算词 A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、说明:使用外连接 A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select aa, ab, ac, bc, bd, bf from a LEFT OUT JOIN b ON aa = bc B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 select语句:[()表示空格 以下表的名称以 表1 为例] 1,select from 表的名称[表1] 意思是:从表1中查询它的全部内容。 其中:表示全部内容。如果不查询表1中的全部内容,那么查询什么就把什么发在的位置上。例如: select name from 表1 其中的name就是要查询的一项内容。 如果要查询的内容是多项那么用逗号隔开,例如: select name,age from 表1 2,select top 一个数字 from 表1 意思是:从表1中查询前 X 项的全部内容。 可以用表1中的内容表示。意思是:从表1中查询前 X 项某一项的内容。而不是全部内容。 3,select from 表1 where 表中某一项满足的条件。例如: Select from 表1 where submit_date<#2003-11-1#意思是: 从表1中查询满足sumit_date在2003-11-1之前的全部内容。 select from 表1 where 表中某一项满足的条件 and 另一项内容满足的条件。例如: Select from 表1 where submit_date<#2003-11-1# and real_name=“建波” 。意思是: 从表1中查询满足sumit_date在2003-11-1之前和real_name="建波"的全部内容 4,select from 表1 where 表1中某一项满足的条件 like "关键字"。例如: select form 表1 where real_name like "勇"。意思是: 从表1中查询real_name中有 关键字 “勇”的全部内容。 5,select from 表1 order by order 某一项内容 升降顺序。例如: Select from 表1 order by real_name asc 升序排列 Select from 表1 order by real_name desc 降序排列 意思是 从表1中按照 real_name 的升降顺序查询 6,Select from 表1 order by real_name desc,submit_date asc 如果有按多个字段排序,中间用逗号隔开 7,查询满足条件的记录的总数 select count () as total from 表1 where 某一项内容满足的条件 (计数) (总数) Select count () as total from 表1 where submit_date<#2003-11-1#。意思是: 从表1中查询满足sumit_date在2003-11-1之前的总数 8,select sum (某一项) as total 某一项,average(某一项) as average 某一项 from 表1 group by class。例如: Select sum (grade) as total_grade,average(grade) as average_grade from 表1 group by class。意思是: 从表1中查询这个班 grade 的总数 和 这个班 grade 的平均数 Insert语句 主要的功能是向数据库添加新的信息 语法是:insert into 表1 (字段1,字段2,……) value (字段1德值,字段2的值,……) 例如: (1)插入user_name字段: Insert into users(user_name)values("wuyuanzhi") (2)只插入user_name和real_name字段 Insert into users (user_name,real_name) values("yuanzhi","远志") 说明:user_name 是主键,必须插入值,而且还不能跟原来的用户名 重复。 (3)只插入user_name 和 submit_date 字段 insert into users (user_name,submit_date) value ("yuanzhi",#2007-01-01#) (4)假如在users表中增加一个年龄字段age,为数字类型,则为:insert into users (user_name,age) value ("yuanzhi",23) (5)在users表中增加一条完整的记录: insert into users (user_name,password,real_name,tel,email,submit-date) value("yuanzhi","2468912340","远 志","15001016610","wuyuanzhi226@163com",#2007-01-02#) Delete 语句 作用是:可以删去表中无用德记录 语法:delete from 表1 [where 条件] 说明:1,where 条件与select中的用法是一样的,凡是符合条件的记录都会被删除,如果没有符合条件的记录则不删除 2,如果省略where条件,将删除所有数据。 下面是常用的例子: (1)删除user_name为"yuanzhi"的用户 delete from 表1 where user_name="yuanzhi" (2)删除2003年1月1日前注册,并real_name为 "李亚" 的用户 Delete from 表1 where submit_date<#2003-01-01# and real_name="李亚" (3)删除表中所有的数据 Delete from 表1 Update 语句 在实际生活中,数据信息在不断变化,例如用户表中,电话可能会经常变化,在这个时候就可以使用update语句来实现更新数据的功能。 语法:update 数据库名 set 字段1=字段值1,字段2=字段2,……[where 条件] 例如(1)修改user_name为 "yuanzhi" 的用户的电话和e-mail地址。 update 表1 set tel="15001016610",e-mail="wuyuanzhi226@163com" where user_name="yuanzhi" (2)将所有2003年一月一日前注册日期统一更改为2003年一月一日。 update users set submit_date=#2003-01-01# where submit_date<#2003-01-01# (3)假如有年龄字段age,将所有的人的年龄增加10岁 update 表1 set age=age+10这些都是常用的,找你有用的慢慢看哈

一 ROWID的概念

存储了row在数据文件中的具 置 位编码的数据 A Z a z + 和 /

row在数据块中的存储方式

SELECT ROWID last_name FROM hr employees WHERE department_id = ;

比如 OOOOOOFFFBBBBBBRRR

OOOOOO data object number 对应dba_objects data_object_id

FFF file# 对应v$datafile file#

BBBBBB block#

RRR row#

Dbms_rowid包

SELECT dbms_rowid rowid_block_number( AAAGFqAABAAAIWEAAA ) from dual;

具体到特定的物理文件

二 索引的概念

类似书的目录结构

Oracle 的 索引 对象 与表关联的可选对象 提高SQL查询语句的速度

索引直接指向包含所查询值的行的位置 减少磁盘I/O

与所索引的表是相互独立的物理结构

Oracle 自动使用并维护索引 插入 删除 更新表后 自动更新索引

语法 CREATE INDEX index ON table (column[ column] );

B tree结构(非bitmap)

[一]了解索引的工作原理

表 emp

目标 查询Frank的工资salary

建立索引 create index emp_name_idx on emp(name);

[试验]测试索引的作用

运行/rdbms/admin/utlxplan 脚本

建立测试表

create table t as select from dba_objects;

insert into t select from t;

create table indextable

as select rownum id owner object_name subobject_name

object_id data_object_id object_type created

from t;

set autotrace trace explain

set timing on

分析表 可以得到cost

查询 object_name= DBA_INDEXES

在object_name列上建立索引

再查询

[思考]索引的代价

插入 更新

三 唯一索引

何时创建 当某列任意两行的值都不相同

当建立Primary Key(主键)或者Unique constraint(唯一约束)时 唯一索引将被自动建立

语法 CREATE UNIQUE INDEX index ON table (column);

演示

四 组合索引

何时创建 当两个或多个列经常一起出现在where条件中时 则在这些列上同时创建组合索引

组合索引中列的顺序是任意的 也无需相邻 但是建议将最频繁访问的列放在列表的最前面

演示(组合列 单独列)

五 位图索引

何时创建

列中有非常多的重复的值时候 例如某列保存了 性别 信息

Where 条件中包含了很多OR *** 作符

较少的update *** 作 因为要相应的跟新所有的bitmap

结构 位图索引使用位图作为键值 对于表中的每一数据行位图包含了TRUE( ) FALSE( ) 或NULL值

优点 位图以一种压缩格式存放 因此占用的磁盘空间比标准索引要小得多

语法 CREATE BITMAP INDEX index ON table (column[ column] );

掩饰

create table bitmaptable as select from indextable where owner in( SYS PUBLIC );

分析 查找 建立索引 查找

六 基于函数的索引

何时创建 在WHERE条件语句中包含函数或者表达式时

函数包括 算数表达式 PL/SQL函数 程序包函数 SQL函数 用户自定义函数

语法 CREATE INDEX index ON table (FUNCTION(column));

演示

必须要分析表 并且query_rewrite_enabled=TRUE

或者使用提示/+ INDEX(ic_index)/

七 反向键索引

目的 比如索引值是一个自动增长的列

多个用户对集中在少数块上的索引行进行修改 容易引起资源的争用 比如对数据块的等待 此时建立反向索引

性能问题

语法

重建为标准索引 反之不行

八 键压缩索引

比如表landscp的数据如下

site feature job

Britten Park Rose Bed Prune

Britten Park Rose Bed Mulch

Britten Park Rose Bed Spray

Britten Park Shrub Bed Mulch

Britten Park Shrub Bed Weed

Britten Park Shrub Bed Hoe

……

查询时 以上 列均在where条件中同时出现 所以建立基于以上 列的组合索引 但是发现重复值很多 所以考虑压缩特性

Create index zip_idx

on landscp(site feature job)

press ;

将索引项分成前缀(prefix)和后缀(postfix)两部分 前两项被放置到前缀部分

Prefix : Britten Park Rose Bed

Prefix : Britten Park Shrub Bed

实际所以的结构为

Prune

Mulch

Spray

Mulch

Weed

Hoe

特点 组合索引的前缀部分具有非选择性时 考虑使用压缩 减少I/O 增加性能

九 索引组织表(IOT)

将表中的数据按照索引的结构存储在索引中 提高查询速度

牺牲插入更新的性能 换取查询性能 通常用于数据仓库 提供大量的查询 极少的插入修改工作

必须指定主键 插入数据时 会根据主键列进行B树索引排序 写入磁盘

十 分区索引

簇:

A cluster is a group of tables that share the same data blocks because they share mon columns and are often used together

lishixinzhi/Article/program/Oracle/201311/17769

以上就是关于ORACLE数据库中权限和角色的全面解析全部的内容,包括:ORACLE数据库中权限和角色的全面解析、oracle sql是怎么解析的、读数据库,数据量太大,访问过程中,出现内存访问异常,该如何解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9596755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存