行编号
行编号是用来唯一标记表中行的伪列。它是物理表中行数据的内部地址,包含两个地址,其一指向数据库表中包含该行的块所存放数据文件的地址;另一个是可以直接定位到数据行自身的这一行在数据块中的地址。
行编号解码<br>column filen format a50 head 'File Name'<br><div>SELECT E.ROWID,(</div><div> SELECT FILE_NAME</div><div> FROM DBA_DATA_FILES</div><div> WHERE FILE_ID = DBMS_ROWID.rowid_to_absolute_fno(E.ROWID,USER,'EMP')) FILEN,</div><div> DBMS_ROWID.rowid_block_number(E.ROWID) BLOCK_NO,</div><div> DBMS_ROWID.rowid_row_number(E.ROWID) ROW_NO</div><div> FROM EMP E</div><div> WHERE E.EMPNO = '7788'</div>
行编号指向一个特定行的准确位置。因此当使用索引访问数据行时,就会对谓语中提供的访问标准进行匹配,然后使用行编号访问指定的文件/数据块/数据行。
索引结构
索引包含一个或多个层次的分支块以及一个层次的叶子块
分支块保存着下一层级分支所包括的值范围信息,它被用来在索引结构中进行搜索以获得所需的叶子块
索引的高度是指第一个分支块(即根块)到叶子块的分支层级数目。
唯一引起索引高度增加的就是当数据块分裂的时候。由于这一点,所有叶子数据块到根数据块的距离都是一样的。
1、根数据块存储指向下层索引块的指针。这个指针指向新索引块的相对数据块地址和表明相关叶子块中最低索引值的值组成。
索引扫描特性
共同点:必须遍历索引结构以访问匹配搜索值的叶子索引块。
类型:索引范围扫描、索引唯一扫描、索引全扫描、索引跳跃扫描和索引快速全扫描
聚簇因子——非常重要的索引统计信息。索引的聚簇因子统计信息帮助优化器生成使用索引的成本信息,并且是表中建立了索引的数据排序优良度的一个度量值。
12c中,可以定义一种新的统计信息收集偏好——table_cached_blocks,将这个偏好的值设置为大于1,但小于或等于255,只要当前索引项所引用的表数据块已经被之前n个索引项引用,统计信息的收集就不会增加聚簇因子,这个偏好可以用DBMS_STATS.SET_TABLE(SCHEMA/DATABASE)_PREFS设置,过程如下:<br>dbms_stats.set_table_prefs(<br>ownname => 'HR',<br>tabname => 'EMP',<br>pname => 'TABLE_CACHED_BLOCKS'<br>pvalue => 50<br>)
1、聚簇因子与表中的数据有关而不是与索引相关,所以重建索引对它不会有任何影响<br>2、小心重建表改进聚簇因子的陷阱,重建表可能改进了一个索引却破坏了其他索引。且重建表非常耗费时间和资源
索引扫描种类
索引唯一扫描
概念:当谓语中包含使用unique或primary key索引的列作为条件时,就会选用索引唯一扫描
标识:执行计划中“TABLE ACCESS BY INDEX ROWID”<br>INDEX UNIQUE SCAN
索引范围扫描
概念:当谓语中包含将会返回一定范围数据的条件时,就会选用索引范围扫描
标识:执行计划中“TABLE ACCESS BY INDEX ROWID”<br>INDEX RANGE SCAN
条件:<、>、like、between或=
索引全扫描
概念:当没有谓语但是所需列的列表可以通过其中一列的索引获得,谓语中包含一个位于索引中非引导列上的条件,或者数据可以通过一个排序的索引来获取并且省去单独的排序步骤。
标识:执行计划中“TABLE ACCESS BY INDEX ROWID”<br>INDEX RANGE SCAN
条件:<、>、like、between或=
索引跳跃扫描
概念:当谓语中包含位于索引中非引导列上的条件,并且引导列的值唯一时会选择索引跳跃扫描
标识:执行计划中“TABLE ACCESS BY INDEX ROWID BATCHED”<br>INDEX SKIP SCAN
条件:建立组合索引,谓语使用非引导列作为条件
索引快速全扫描
概念:当选用索引快速全扫描时,所有索引块都将通过多块读取来进行
标识:执行计划中“INDEX FAST FULL SCAN”<br>
条件:这种类型的索引扫描是用来在查询列表中所有字段都包含在索引中并且索引中至少有一列具有非空约束时替代全表扫描的
联结方法
嵌套循环联结
1、驱动表的选择<br>2、表间联结顺序<br>3、优化性能的关键点之一是确保只做必须的工作
提示:leading(表1,表2) use_nl(表1)
散列联结
条件:散列联结只有在相等联结的情况下才能进行。
提示:use_hash
应用场景:当数据行源较大并且结果集也较大时最好考虑散列联结。<br>使用ora_hash函数测试,分别查询一定范围内的散列值。
排序-合并联结
概念:排序-合并联结需要独立的读取需要联结的两张表,对每张表中的数据行按照联结键排序,然后将排序后的数据行集合并。
应用场景:一般最适合数据筛选条件有限并返回有限数据行的查询<br>如果数据行源非常大,排序-合并就可能是唯一可行的选择
提示:ordered
笛卡尔联结
概念:当一张表的所有行与另一张表的所有行联结时。
在笛卡尔联结执行计划中,BUFFER SORT运算并不是真正的排序,而是Oracle将每一行与每一行进行联结,使用缓冲区排序机理来将第二张表的数据块从缓冲区缓存中复制出并放入到私有内存中,避免缓冲区缓存中的同一个数据块被一次又一次访问。
外联结
概念:外联结返回一张表的所有行以及另一张联结表中满足联结条件的行数据。Oracle使用+字符来表明进行外联结