2022年oracle的表分析策略 .pdf

上传人:Che****ry 文档编号:34263029 上传时间:2022-08-15 格式:PDF 页数:5 大小:41.87KB
返回 下载 相关 举报
2022年oracle的表分析策略 .pdf_第1页
第1页 / 共5页
2022年oracle的表分析策略 .pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《2022年oracle的表分析策略 .pdf》由会员分享,可在线阅读,更多相关《2022年oracle的表分析策略 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、oracle 的表分析策略对表进行分析,通常情况下可以对表,索引,列进行单独分析,或者进行组合分析,但这三者哪些是相对重要的,哪些分析显得不那么重要?通过本篇文章的实验相信大家也会对直方图有更一步的了解. 1.首先创建测试表,并插入 100000 条数据SQL create table test(id number,nick varchar2(30); Table created. SQL begin 2 for i in 1.100000 loop 3 insert into test(id) values(i); 4 end loop; 5 commit; 6 end; 7 / PL/SQ

2、L procedure successfully completed. 更新 nick 字段,使数据发生严重倾斜SQL update test set nick=abc where rownum commit; Commit complete. SQL create index idx_test_nick on test(nick); Index created. SQL update test set nick=def where nick is null;2 rows updated. SQL commit; Commit complete. -只对索引进行分析SQL analyze in

3、dex idx_test_nick compute statistics; Index analyzed. SQL select index_name,LEAF_BLOCKS,DISTINCT_KEYS,NUM_ROWS from user_indexes where index_name=IDX_TEST_NICK; INDEX_NAME LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS - - - - IDX_TEST_NICK 210 2 100000 SQL select COLUMN_NAME,NUM_BUCKETS,num_distinct from USER_

4、tab_columns where table_name=TEST; COLUMN_NAME NUM_BUCKETS NUM_DISTINCT - - - ID NICK 查看只分析索引的情况下的执行计划,从执行计划可以看出,优化器选择RBO,都走索引SQL set autotrace trace exp 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - SQL select * from test where nick =abc

5、; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON-UNIQUE) SQL select * from test where nick =def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST 2 1 INDEX (RANG

6、E SCAN) OF IDX_TEST_NICK (NON-UNIQUE) 分析有数据严重倾斜的nick 列后 ,也没有产生正确的执行计划,此时使用的优化器仍然是RBO 通过此实验,说明只分析索引和列,ORACLE 不会使用CBO 的优化器SQL analyze table test compute statistics for columns size 2 nick; Table analyzed. SQL select * from test where nick =abc; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE 1 0

7、TABLE ACCESS (BY INDEX ROWID) OF TEST 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON-UNIQUE) SQL select * from test where nick =def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON-UNIQUE) 现在分析表后 ,产生了正确的执行计划SQL

8、 analyze table test compute statistics for table; Table analyzed. SQL select * from test where nick =abc; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=50 Card=99998 Bytes= 1499970) 1 0 TABLE ACCESS (FULL) OF TEST (Cost=50 Card=99998 Bytes=14 99970) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

9、- - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - SQL select * from test where nick =def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=2 Bytes=30) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=2 Bytes=30) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON

10、-UNIQUE) (Cost =1 Card=2) 删除所有的统计数据,并只对表与列进行分析,不分析索引, ORACLE 使用 CBO 的优化器,并产生了正确的执行计划SQL analyze table test delete statistics; Table analyzed. SQL analyze table test compute statistics for table for columns size 2 nick; Table analyzed. SQL select * from test where nick =abc; Execution Plan - 0 SELECT

11、 STATEMENT Optimizer=CHOOSE (Cost=50 Card=99998 Bytes= 1499970) 1 0 TABLE ACCESS (FULL) OF TEST (Cost=50 Card=99998 Bytes=14 99970) SQL select * from test where nick =def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=2 Bytes=30) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1

12、Card=2 Bytes=30) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON-UNIQUE) (Cost =1 Card=2) 创建 TEST 表 ID 列上的索引,但不对索引进行分析SQL create index idx_test_id on test(id); Index created. SQL select * from test where id=1; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1000 Bytes=15 000) 1 0 TABL

13、E ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=1000 Bytes=15000) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_ID (NON-UNIQUE) (Cost=1 Card=400) 当条件中即有id,又有 nick 时,因为 nick 上有直方图 ,ORACLE 知道 nick=abc 的值特别的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - -

14、多,所以不走IDX_TEST_NICK索引 ,走 IDX_TEST_ID上的索引SQL select * from test where id=5 and nick=abc; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1000 Bytes=15 000) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=1000 Bytes=15000) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_ID (NON-UNIQUE) (Co

15、st=1 Card=400) 当条件中即有id,又有nick 时,因为 nick 上有直方图 ,ORACLE 知道 nick=def 的值特别的少,所以走IDX_TEST_NICK上的索引 ,不走 IDX_TEST_ID索引SQL select * from test where id=5 and nick=def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=15) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=1 Bytes

16、=15) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_NICK (NON-UNIQUE) (Cost =1 Card=2) 在分析 ID 列后,ORACLE 发现 ID 列的选择度更高,所以不再选择IDX_TEST_NICK索引,而是选择IDX_TEST_ID SQL analyze table test compute statistics for columns size 1 id; Table analyzed. SQL select * from test where id=5 and nick=def; Execution Plan - 0 SELECT S

17、TATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=7) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=1 Bytes=7) 2 1 INDEX (RANGE SCAN) OF IDX_TEST_ID (NON-UNIQUE) (Cost=1 Card=1) 下面来看另外一种情况,我们删除所有的统计数据,然后在 ID 列上创建唯一索引,在此条件下,只分析表与分析列nick, 我们看到ORACLE 走了正确的执行计划,走了UK_TEST_ID,其实从这里也给我们带来很多的启示:在主键与唯一键

18、约束的列上是否需要直方图的问题?如果在这些列上有像这样的查询where id 100 and id analyze table test delete statistics; Table analyzed. SQL drop index idx_test_id; Index dropped. SQL create unique index uk_test_id on test(id); Index created. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页

19、- - - - - - - - - SQL analyze table test compute statistics for table for columns size 2 nick; Table analyzed. SQL select * from test where id=5 and nick=def; Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=15) 1 0 TABLE ACCESS (BY INDEX ROWID) OF TEST (Cost=1 Card=1 Bytes=

20、15) 2 1 INDEX (UNIQUE SCAN) OF UK_TEST_ID (UNIQUE) (Cost=1 Car d=1) 从以上一系列的实验可以看出,对ORACLE的优化器CBO 来说,表的分析与列的分析才是最重要的, 索引的分析次之。还有我们可以考虑我们的哪些列上需要直方图,对于 bucket的个数问题 ,oracle 的默认值是75 个,所以根据你的应用规则,选择合适的桶数对性能也是有帮助的。因为不必要的桶的个数的大量增加,必然会带来SQL 语句硬解析时产生执行计划的复杂度问题。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁