视图:常被称为虚表,create view。视图是一个数据库对象,他允许用户从一个表或一组表中建立一个“虚表”,它本身没有数据,仅仅是一条查询语句。它可以方便的在各个表中进行联合查询,这对用户来说是很方便的,其次,可以增加安全性,屏蔽一些不想让无权限的用户看一些表中的数据即隐藏了基本表,这同时也可以隐藏着其中的复杂性,有时更改起来也很方便而不必涉及到应用程序。如一个表中有3列数据,我只想让其他用户看到2列,这时候视图就会显得十分方便。如表school 有ID,name,lesson三项。
索引:索引是与磁盘上数据的存储方式不同的另外一组数据的方法,索引的特例是表中记录一句其在磁盘上的存储位置显示,索引可以在表内创建一个列或列的组合。通过对正确的、特定的两个表的归并字段进行索引可以获得明显的好处。
ps:视图和索引是两个完全不同的对象,但有一点是相同的:它们都与一个表或数据库相关联,尽管每一个对象只能与一个特定的表相关联,但它们还是通过对数据的预排序和预定义显着地提高了表的工作性能。
使用视图:create view view_name(col1,col2……) as select table_name(col1,col2……) from table_name;
select规则:1.不能使用union 2.不能使用order by,但使用group by有其相同功能
DML的规则:1.对于多表视图不能使用delete
2.除非非空列都出现在视图中,否则不能使用insert
3.对于一个归并(merger)的表插入或更新,所有被更新的记录必须属于同一个物理表
4.如果创建视图时使用dintinct子句,就不能插入或更新这个视图
5.不能更新视图中 的虚拟列(它是用计算字段得到的)
删除视图:drop view view_name;
使用索引
索引可以让存储于磁盘上的数据进行重新排序
使用索引的原因:1.在使用unique关键字时前执行的保证数据的完整性
2.可以容易的用索引字段或其他字段进行排序
3.提高查询执行速度
索引的概念:
两种方法从数据库中获得数据:1.顺序访问方式,需要sql检查每一个记录以找到与之匹配的,此法效率很低,但它是使记录准确定位的唯一方法。 2.使用索引的的直接访问方式,sql采用树形结构来存储和返回所以数据,用以指示的数据存储在树的最末端(也就是叶子),它们被称为结点(也可以叫叶 子)。每个结点中有一个指向其他结点的指针,结点左边的值只是它的双亲结点,结点右边的值则是孩子结点或叶子。sql将从根结点开始找到所需的数据。
ps:当查询没有使用索引的表时,查询通常是全表搜索后才会得到结果,全表搜索会让数据库服务程序遍历过表中的所有记录然后返回给定条件的记录。索引可以让数据库服务程序快速的定位到表中的确定行。
create index index_name on table_name(column_name1,[column_name2],...);
SQL Server 和ORACLE允许你创建成簇的索引。Informix和ORACLE允许你指明列名是按升序排列还是按降序排列。
使用索引不会对表中的物理存储造成影响
order by和索引的区别:
使用order by子句时,每次运行它都需要重新进行排序,而使用索引时,数据库会建立一个物理索引对象(树结构),每次运行查询时都访问同一个索引。
当表被删除时,所有与之相关的索引也将被删除。
使用索引的技巧:
1.对于小表来说,使用索引对于性能不会有任何提高
2.当你的索引列中有极多的不同数据和空值时,索引会使性能有极大的提高
3.当查询要返回的数据很少时(少于全部数据的25%),索引可以优化你的查询,如果要返回的数据很多时,索引会加大系统开销
4.索引可以提高数据的返回速度,但它使得数据的更新操作变慢。(对记录和索引进行更新时请不要忘记先删除索引,当执行完更新操作后,恢复索引即可,对于一次特定的操作 ,系统可以保存删除的索引18个小时,在这个时间内数据更新完成后你可以恢复它。)
5.索引会占用数据库空间
6.可以提高归并速度
7.大多数数据库系统不允许对视图使用索引
8.不要对经常需要更新或修改的字段创建索引,否则会降低性能
9.不要将索引与表存储在同一个驱动器上,分开存储会去掉访问冲突从而使结果返回的更快。
复合索引
对多个字段进行索引(一个索引包含多个列)
CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID, AMOUNT );尽量将经常在查询中使用的字段放在最前边。
复合索引的性能与单个字段的索引相比是无法判定的。
创建索引时使用unique关键字
复合索引通常使用unique关键字来防止有相同数据的多个记录多次出现。-----(oracle7不支持,从8i开始支持)
索引与归并
当查询中使用了复杂的归并时,你的select语句会好用很长时间。
在归并时对字段创建索引可以显着得提高查询反应速度。但创建太多的索引,会使性能下降而不是提高
作为一个规,则你应该对表中的唯一属性的字段或你用以归并操作的字段来创建索引。
群集(簇)的使用
当 使用群集索引时,数据在表中的物理排序方式会被修改,使用群集索引通常比传统的不使用群集索引速度要快。ORACLE 中群集的概念与此不同,当使用ORACLE 关系数据库系统时,群集就是一个像数据或表一样的对象,群集一般是存储了表的共有字段以提高对表的访问速度。
oracle7的例子:
CREATE CLUSTER [schema.]cluster (column datatype [,column datatype] ... )
[PCTUSED integer] [PCTFREE integer] [SIZE integer [K|M] ]
[INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace]
[STORAGE storage_clause] [!!under!!INDEX | [HASH IS column] HASHKEYS integer]
你随后创建的其于该表的群集的索引会被加入到群集中,然后把表也加入群集中。你应该只将经常需要归并的表加入到群集,不要向群集中加入只需要用简单的SELECT 语句进行个别访问的表。
事务处理控制
事务控制
事务控制(事务处理)指关系数据库系统执行数据库事务的能力。(逻辑分组,它有自己的开始和结束)
事务:逻辑上必须完成的一命令序列的单位
单元工作期:事务的开始和结束时期
开始事务处理
SET TRANSACTION {READ ONLY | USE ROLLBACK SEGMENT segment}
可以在下列语句中使用READ ONLY选项:SELECT、LOCK TABLE、SET ROLE、ALTER SESSION、ALTER SYSTEM
有些数据库支持SET AUTOCOMMIT [ON | OFF]
结束事务处理
COMMIT [WORK][ COMMENT 'text'| FORCE 'text' [, integer] ] ;
COMMIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME)
取消事务处理
这必须是在COMMIT 之前,ROLLBACK 语句必须在一个事务之中运行,它可以一直撤消到事务的开始
在事务中使用保存点
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
数据库安全
技巧要带着下边的问题去规划你数据库系统的安全性
1. 谁应该得到数据库管理员权限?
2. 有多少个用户需要访问数据库系统?
3. 每个用户应该得到什么样的权限与角色?
4. 当一个用户不再访问数据库时应该如何去删除它?
oracle使用三个结构来实现安全性:用户、角色、权限
用户:
CREATE USER user
IDENTIFIED {BY password | EXTERNALLY}
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]
[PROFILE profile]
如 果选择了EXTERNALLY 选项,ORACLE 将会依赖于你登录进入计算机系统的用户名和密码,也就是说当你登录进行计算机时你就已经登录进行了ORACLE。我们推荐你使用IDENTIFIED BY 子句强制用户在登录进行系统时输入密码IDENTIFIED BY PASSWORD
角色:
GRANT role TO user [WITH ADMIN OPTION];
REVOKE role from user;
使用视图、同义词等提高安全性