concepts阅读总结6——视图和索引

1、视图:

视图不会要求分配空间,他只有一个查询语句即为他的定义,存储在数据字典中。当用户在sql语句中引用了视图时,oracle将进行入下工作:

1、将引用视图的语句与视图定义语句整合为一条sql语句。

2、在共享SQL区对这条语句进行解析。

3、执行解析好的语句。

下面看看oracle是如何整合查询一条语句的:

例如有以下视图:

CREATE VIEW employees_view AS 
SELECT employee_id, last_name, salary, location_id
FROM employees JOIN departments USING (department_id)
WHERE departments.department_id = 10;

用户提交了以下查询:

SELECT last_name 
FROM employees_view 
WHERE employee_id = 9876;

用户提交的查询经 Oracle 整合(merge),转化(transform)后的最终结果为:

SELECT last_name 
FROM employees, departments
WHERE employees.department_id = departments.department_id AND 
departments.department_id = 10 AND
employees.employee_id = 9876;

Oracle 会尽可能地将用户查询及其中所引用视图的定义查询(可能还包括视图所引用的其他视图)进行整合。Oracle 将优化整合后的语句,就如同用户提交的语句中没有引用视图一样。因此,无论一列是被视图的定义引用,还是被用户提交的查询引用,Oracle 都可以使用建于基表列(base table column)上的索引。

物化视图:

关于物化视图的详细介绍参照我的博客:http://blog.csdn.net/changyanmanman/article/details/8029422

物化视图(materialized view)是一种可以用于汇总(summarize),计算(compute),复制(replicate),及发布(distribute )数据的方案对象(schema object)。她适用于数据仓库(data warehouse),决策支持(decision support),分布式计算(distributed),及移动(mobile)计算等多种环境:

我理解的物化视图是一个基于查询结果的对象,他是远程数据库的本地副本,物化视图的存储基于远程表的数据。。。

通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。

对于复制,物化视图允许你在本地维护远程的数据副本,这些副本都是只读的,如果你想复制本地副本,必须用高级复制功能,当你想从一个表或者一个视图中抽取数据的时候,你就可以从本地的物化视图中抽取。

对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。

  • 在数据仓库中,物化视图常被用于计算和存储聚合数据(aggregated data),例如汇总(sum),平均(averages)等。在数据仓库环境中,物化视图也被称为概要(summaries),因为 其中通常存储的是汇总数据(summarized data)。用户也可以使用物化视图存储多个表连接后的结果集(compute
    join)。如果数据库的兼容性参数被设为 Oracle9i 或更高,物化视图的查询中可以包含过滤选择(filter selection)

    优化器(optimizer)可以利用物化视图来提升查询性能。优化器能够自动地判断一个存储汇总数据的物化视图是否能满足用户的查询要求,以及使用此物化视图是否能提高查询性能。之后优化器能够重写(rewrite)用户提交的查询以便使用相应的物化视图,而这个重写过程对用户是透明的。此时查询直接使用物化视图,而非用户提交的 SQL 语句中指定的明细数据表或视图。

  • 在分布式环境中,用户可以使用物化视图提供的功能在各个分布的节点(distributed site)间复制数据, 同步(synchronize)各个节点的数据修改,并在发生冲突时进行处理。利用物化视图的复制能力,用户可以将原本必须从远程节点(remote site)访问的数据移动到本地节点(local
    site),实现本地访问。
  • 在移动计算环境中,移动客户端(mobile client)可以使用物化视图从中央服务器(central server)下载一个数据的子集(subset),还可以定期地从中央服务器取得最新数据,并将移动客户端的数据修改发送回中央服务器。

物化视图(materialized view)与索引(index)有以下相似之处:

  • 物化视图需要占用存储空间。
  • 当其主表(master table)内的数据发生变化时,物化视图需要刷新
  • 当查询重写(query rewrite)使用物化视图时,能够提升 SQL 语句的执行效率
  • 物化视图对提交 SQL 的用户和应用程序是透明的

2、索引:

一个数据块(data block)内可用于存储索引数据的空间等于数据块容量减去数据块管理开销(overhead),索引条目管理开销(entry overhead),rowid,及记录每个索引值长度的 1 字节(byte)。

oracle创建索引时,oracle取得所有被索引的列的数据进行排序,排序后将索引列对应的rowid按照刚才牌号的顺序依次加到索引中,如下面一句话:

CREATE INDEX employees_last_name ON employees(last_name);

racle 先将 employees 表按 last_name 列排序,再将排序后的  列及相应的 rowid 按从下到上的顺序加载到索引中。使用此索引时,Oracle 可以快速地搜索已排序的last_name 值,并使用相应的
rowid 去定位包含用户所查找的 last_name 值的数据行。

对于唯一索引(unique index),每个索引值对应着唯一的一个 rowid。对于非唯一索引(nonunique index),每个索引值对应着多个已排序的 rowid。因此在非唯一索引中,索引数据是按照索引键(index key)及 rowid 共同排序的。键值(key value)全部为NULL 的行不会被索引,只有簇索引(cluster
index)例外。在数据表中,如果两个数据行的全部键值都为 NULL,也不会与唯一索引相冲突。

索引的键压缩:

一般来说,索引的一个键(key)通常由两个片段(piece)构成:分组片段(grouping piece)及唯一片段(unique piece)。如果定义索引的键中不存在唯一片段,Oracle 会以 ROWID 的形式在此键的分组片段后添加一个唯一片段。键压缩(key compression)就是将键的分组片段从键中拆分出来单独存储,供多个唯一片段使用。

键压缩(key compression)能够节约大量存储空间,因此用户可以在一个索引块(index block)内存储更多的索引键(index key),从而减少 I/O,提高性能。

键压缩(key compression)能够减少索引所需的存储空间,但索引扫描时需要重构(reconstruct)键值(key value),因此增加了 CPU 的负担。此外键压缩也会带来一些存储开销,每个前缀(prefix entry)需要 4 字节(byte)的管理开销。

使用键压缩:

键压缩(key compression)在多种情况下都能够发挥作用,例如:

  • 对于非唯一索引(nonunique index),Oracle 会在每个重复的索引键(index key)之后添加 rowid 以便区分。如果使用了键压缩,在一个索引块(index block)内,Oracle 只需将重复的索引键作为前缀((prefix entry))存储一次,并用各行的 rowid 作为后缀(suffix entry)。
  • 唯一索引(nonunique index)中也存在相同的情况。例如唯一索引(stock_ticker,transaction_time)的含义是(项目,时间戳),通常数千条记录中 stock_ticker 的值是相同的,但她们对应的 transaction_time 值各不相同。使用了键压缩后,一个索引块中每个 stock_ticker 值作为前缀只需存储一次,而各个 transaction_time 值则作为后缀存储,并引用一个共享的 stock_ticker 前缀。
  • 在一个包含 VARRAY 或 NESTED TABLE 数据类型(datatype)的索引表(index-organized table)中,这些collection 类型中各个元素(element)的对象标识符(object
    identifier)是重复的。用户可以使用键压缩以避免重复存储这些对象标识符。

位图索引:

在位图索引中,只需存储每个键值的位图,而非一组ROWID。 在位图中,每一位(bit)对应一个可能的rowid,如果某一位被 置位(set),那就说明这位对应的ROWID所指向的行中,包含此位所代表的键值。oracle通过一个映射函数将位图信息转化为实际的rowid。

因此虽然位图索引(bitmap index)内部的存储结构与常规索引不同,但她同样能实现常规索引的功能。当不同值的索引键的数量较少时,位图索引的存储效率相当高。

如果在 WHERE 子句内引用的多个列上都建有位图索引(bitmap index),那么进行位图索引扫描时(bitmap indexing)可以将各个位图索引融合在一起。不满足全部条件的行可以被预先过滤掉。因此使用位图索引能够极大地提高查询的响应时间。

数据仓库应用中位图索引的优势

数据仓库应用(data warehousing application)的特点是数据量巨大,执行的多为自定义查询(ad hoc query),且并发事务较少。这种环境下使用位图索引(bitmap index)具备如下优势:

  • 能够减少大数据量自定义查询的响应时间
  • 与其他索引技术相比能够节省大量存储空间
  • 即使硬件配置较低也能显著提高性能
  • 有利于并行 DML 和并行加载

为一个大表建立传统的平衡树索引(B-tree index)可能占用极大的存储空间,索引有可能比数据表还要大数倍。而一个位图索引(bitmap index)所占的空间比被索引数据还要小得多。

位图索引(bitmap index)不适用于 OLTP 系统,因为这样的系统中存在大量对数据进行修改的并发事务。位图索引主要用于数据仓库系统中(data warehousing)的决策支持功能,在这种环境下用户对数据的操作主要是查询而非修改。

主要进行大于(greater than)或小于(less than)比较的列,不适宜使用位图索引(bitmap index)。例如,WHERE 子句中常会将 salary 列和一个值进行比较,此时更适合使用平衡树索引(B-tree index)。位图索引适用于等值查询,尤其是存在 AND,OR,和 NOT 等逻辑操作符的组合时。

位图索引(bitmap index)是集成在 Oracle 的优化器(optimizer)和执行引擎(execution engine)之中的。位图索引也能够和 Oracle 中的其他执行方法(execution method)无缝地组合。例如,优化器可以在利用一个表的位图索引和另一个表的平衡树索引(B-tree index)对这两张表进行哈希连接(hash join)。优化器能够在位图索引及其他可用的访问方法(例如常规的平衡树索引,或全表扫描(full
table scan))中选择效率最高的方式,同时考虑是否适合使用并行执行。

位图索引(bitmap index)如同常规索引一样,可以结合并行查询(parallel query)和并行 DML(parallel DML)一起工作。建立于分区表(partitioned table)的位图索引必须为本地索引(local index)。Oracle 还支持并行地创建位图索引,以及创建复合位图索引。

基数(某一列中值不重复的个数)

我的理解:对于位图来说,基数越小越好,(就是说希望重复值很多,越多越好啊)

所谓某列的基数小(low cardinality)是指此列中所有不相同的值的个数要小于总行数。如果某列中所有不相同的值的个数占总行数的比例小于 1%,或某列中值的重复数量在 100 个以上,那么就可以考虑在此列上建立位图索引。即便某列的基数较上述标准稍大,或值的重复数量较上述标准稍小,如果在一个查询的 WHERE 子句中需要引用此列定义复杂的条件,也可以考虑在此列上建立位图索引。

例如,一个表包含一百万行数据,其中的一列包含一万个不相同的值,就可以考虑在此列上创建位图索引(bitmap index)。此列上位图索引的查询性能将超过平衡树索引(B-tree index),当此列与其他列作为组合条件时效果尤为明显。

来,看下面这个位图索引的例子:

一个公司部分的客户数据:

婚姻状况,地区,性别,和收入水平都是小基数(low-cardinality)的列。婚姻状况及地区有
3 种可能值,性别有两种,收入水平有 4 种。因此这 4 列上均适合创建位图索引(bitmap index)。而客户编号列上不应创建位图索引,因为此列基数很大。在此列上创建平衡树索引(B-tree index)的存储和查询效率会较高。

在上表的地区列上建立的位图索引(bitmap index)。此索引由 3 个独立的位图组成,每个位图代表一个地区。

位图(bitmap)中的每一位(bit)都对应 CUSTOMER 表中的一行。每一位的值由每行中对应字段的值决定。例如,位图 地区='东部' 的第一位为 1,这是因为 CUSTOMER 表中第一行的地区字段的值为东部。此位图其他位均为
0,因为此表其他行的地区字段的值都不为东部。

一个业务分析员在统计公司客户的地区分布趋势时,需要知道“住在中部或西部地区的已婚客户有多少?”。这个问题对应以下 SQL 语句:

SELECT COUNT(*) FROM CUSTOMER 
WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west');

使用位图索引(bitmap index)处理此查询时,通过布尔运算(Boolean operation)很容易得到一个位图结果集(resulting bitmap),如 图5-8 所示。利用此结果集访问表,就可以得到满足查询条件的客户信息。

图5-8 显示了三个位图。这三个位图之间的布尔运算如下:婚姻状况='已婚' AND (地区='中部' OR 地区='西部')。

与其他大多数索引不同,位图索引(bitmap index)可以包含键值(key value)为 NULL的行。将键值为空的行进行索引对有些 SQL 语句是有用处的,例如包含 COUNT 聚合函数的查询。

索引组织表的二次索引:

http://blog.csdn.net/changyanmanman/article/details/7326505

时间: 2024-08-01 12:24:18

concepts阅读总结6——视图和索引的相关文章

mssql-MSSQL 视图创建索引失败

问题描述 MSSQL 视图创建索引失败 创建视图表的表达式如果不是类似dbo.mytable这样的两段式,而是三段的要怎么解决? 在MS Sql里会报错"名称必须由两部分构成,并且对象不能引用自身." 求大神指导~~

oracle中如何使用视图,索引,存储过程。 就是说怎么去用或者用在什么地方,请指教

问题描述 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 解决方案 具体你去看书,这里只是简单说说:视图,相当于虚拟的表,你可以把不同的表连接起来得到一个视图,直接像表那样返回数据,而不用写复杂的查询了.索引,顾名思义,对表中的数据预处理,加快查询的速度.存储过程,一组预先写好的sql代码的集合,可以直接调用.存储过程因为是事先写好,并且编译的,所以更快,而且它像函数那样,

Word2013进入阅读模式、视图设置功能

  新一代Microsoft Office预览版中的Word2013预览版提供了全新的阅读模式,该模式包含很多方便用户查看文档.注释文档等方面的功能.下面我们一起来体验一下. 微软曾经表示,对于新一代Word产品的阅读模式,首先想到的是重新设计布局,使内容屏幕上看起来更加美观.Word2013的阅读模式提供了非常灵活的布局, 可以根据字体和窗口的大小自动调整分页模式达到租价的视觉效果. 现在我们在Word2013预览版中打开一个文档,点击软件界面左下角的图标,即可进入Word2013全新的阅读模

concepts阅读总结9——数据仓库

数据仓库简介: 数据仓库有四个典型的特点:1.数据仓库是面向主题的 数据仓库的建立是针对一个主题的,可以是一个人事的管理,销售的管理的数据仓库,他的功能就是帮助用户分析数据用的.2.数据仓库是统一的,就是不同形式的数据,不同类型的数据,在存入数据仓库的时候会被转化成统一的形式进行存储. 3.数据仓库是永久的,不应该被删除或者修改,是用来查询使用的.4.数据仓库是历史的,为了发现业务中存在的趋势,分析用户需要使用大量数据.这与联机事务处理(online transaction processing

concepts 阅读总结1——体系结构

1.数据库应用体系结构概述:c/s 结构 和 多层结构  -- 多层体系结构具备以下组成部分:客户端程序,提交数据库操作:一个或多个应用服务器处理一个操作请求的不同部分.应用服务器首先负责访问数据,再对查询结果进行处理,这就减轻了数据库服务器的负担.应用服务器可以作为客户端与数据库之间的接口,还可提供额外的 安全控制:一个数据库服务器,或称为服务端,存储用户操作所需的数据. 在这种体系结构下,应用服务器起到以下作用: 验证用户身份, 连接Oracle数据库服务器 代替用户执行对数据库的请求  物

concepts阅读总结5——堆表

1.方案对象概述: 表: 当oracle创建一个表的时候,数据库会在对应的表空间中为此表分配数据段,具体如何控制数据段的分配和使用的呢?有两个方面的控制:  * 通过设置段的存储参数,控制其空间分配方式(如开始分配多少个数据扩展,这个表总共可以用多少个数据扩展)  * 通过控制数据段内的PCTFREE, PCTUSED 两个参数,控制数据段中的数据扩展内的数据块的可用空间的大小.    Oracle 在存储簇表(clustered table)的数据时统一使用为其所属簇(cluster)创建的数

concepts阅读总结4——事务

1.事务: 语句级回滚和可恢复空间的分配问题: 语句级的回滚一般发生在一条sql语句执行出现错误的时候,这一条语句的回滚不会影响整个事务,在此语句之前的ddl语句隐式提交的工作都是有效的: 当处于可恢复空间分配模式的事务需要分配空间,但是由于空间不足或者达到最大数据扩展的限制时,oracle数据库不会直接报错,它会将此事务挂起,相关占用的空间保留,等到别的事务提交,释放空间,此事务需要的空间足够了,就会再次执行..(我觉得这样形成类似死锁的资源争用很容易,正好两个事务都挂起了,都等着对方释放资源

跟屌丝大哥学DB2-第四课 数据类型 ,表 ,视图,索引,模式,约束(一)

(DiaoSiID)在我们建立表前 ,我们先要了解DB2中都有哪些数据类型,以便我们这些屌丝以后快速创建表. DB2 提供了一套丰富且灵活的数据类型.DB2 附带 INTEGER.CHAR 和 DATE 等基本数据类型.它还提供了创建用户定义的数据类型(UDT)的工具,使用户能够创建复杂的非传统的数据类型,从而适应当今复杂的编程环境.在给定的情况下,选用哪种数据类型取决于列中存储的信息的类型和范围. 内置的数据类型分为四类:数字.字符串.日期时间和 XML. 用户定义的数据类型分为:单值类型.结

concepts阅读总结10——分区

分区概述: 1.范围分区:范围分区(range partitioning)依据用户创建分区时设定的分区键值(partition key value)范围将数据映射到不同分区.范围分区是较常用的分区方式,通常针对日期数据使用.例如,用户可以将销售数据按月存储到相应的分区中. 在采用范围分区时,应注意以下规则: 定义分区时必须使用 VALUES LESS THAN 子句定义分区的开区间上限(noninclusive upper bound).分区键大于等于此修饰符(literal)的数据将被存储到下