优化与索引

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

@对表的访问

1、全表扫描

1、对表所有的块,进行访问,采用多块读的方式

2、设置多块读的参数

SQL> show parameter db_file_multiblock

NAME

TYPE VALUE

------------------------------------

----------- ------------------------------

db_file_multiblock_read_count integ er 16

上面设置的多块读是16,Oracle读的时候尽量每次读取是16块,Oracle不害怕多块读,害怕的是产生多次物理io的读取

成本计算:

cost:标的块数

/db_file_multiblock_read_count db_file_multiblock_read_count这个参数设置的大小会影响Oracle在计算的时候的一个成本。如果说这个参数设置的足够大,那么就会导致好多表不走索引,会去走全表扫描

3、filter:过滤

读取了大量的数据,然后使用条件过滤了大量的数据,剩余了少量的数据行

4、filter是否合适,判断标准

1、读取了多少数据

2、取出了多少数据,过滤了多少数据

假设过滤掉99%的数据,那么过滤是失败的

90%以上的数据过滤掉,我们就应该考虑这个过滤的价值,也就是cost

2、走索引不使用多块读

1、成本计算:

访问索引的成本+索引访问表的成本

访问索引的成本:索引树的高度+叶子节点的块数

索引访问表的成本:行数*集群因子/总行数

2、集群因子:

最小值就是表的块数

最大值就是表的行数

集群因子高带来的问题:

1、计算走索引的时候的成本高

2、额外的占用过多的buffer

3、额外的增加物理io

3、取得数据量一般<5%~20%的话我们建议走索引

4、Oracle在计算成本的时候是假设所有的数据都在磁盘中,这样的话计算的成本都有物理读,而实际的生产中我们经常读取的数据,大部分都缓存在内存中

5、全表扫描在oltp中肯定会产生额外的一些物理读,因此一般不要全表扫描

表整理:

表不存在碎片的问题,表时间长了会有一个集群因子很高的问题,有些索引是一个表的主索引,时间长了可以按照主索引对这个表重新生成一下,按照这个主索引排下序,这样的话表的集群因子又会降下来了

select d.clustering_factor from dba_indexes d where d.table_name='T1'and owner='SYS '; //查看表的集群因子大小

select t.num_rows,t.blocks from dba_tables t where t.table_name='T1'and owner='SYS' ; //查看表的行数和块数

SQL> select * from t1 where object_id=10;

Execution Plan

----------------------------------------------------------

Plan hash value: 3617692013

--------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 8 | 1416 | 155 (2)| 00:00:02 |

|* 1 | TABLE ACCESS FULL| T1 | 8 | 1416 | 155 (2)| 00:00:02 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("OBJECT_ID"=10)

Note

-----

- dynamic sampling used for this statement

Statistics

----------------------------------------------------------

5 recursive calls //递归sql 产生系统级别的select

0 db block gets

762 consistent gets //内存读

0 physical reads //物理读

0 redo size

1401 bytes sent via SQL*Net to client // 服务器给客户端发的字节

492 bytes received via SQL*Net from client //接收的字节

2 SQL*Net roundtrips to/from client //客户端和服务器的响应

0 sorts (memory) //内存排序

0 sorts (disk)

1 rows processed //实际返回一行

1、select*from dba_indexes d where d.index_name like'I_T1%'and owner='SYS';

blevel:是索引的树的高度,一般在5以下

distinct_keys:唯一值得数量

avg_leaf_blocks_per_key:平均块中的叶子块

avg_data_blocks_per_key:平均每个块中的数据块

在这里面有一列是distinct_keys和num_rows 我们希望distinct_keys很

高num_rows/distinct_keys若是很高那么就会取出很多行,所以这样是不好的,我们希望的是索引的值很高接近这个num的值

索引:

1、选择性

希望distinct_keys/num_rows的值大一些

选择性高说明where条件取出的数值少

2、集群因子

cluster_factor 取决于索引访问表的值

看索引好不好主要是上面的两个值

2、关于索引的几个参数

SQL> show parameter ind

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

相关文档
最新文档