- 浏览: 94421 次
- 性别:
- 来自: 北京
最新评论
-
flyhaoheng:
在JAVA程序中应该怎么调用?
IP地址、手机归属和身份证查询接口 -
yobuke:
谢谢!
Thinking in UML 读后感 -
yangleilt:
还是不太明白
james邮件服务器配置详解 -
streamfly:
你好,我的openfire用的3.6.4,按照你上篇和这篇帖子 ...
openfire3.6.2集成现有系统用户 -
onhp:
我连的是oracle数据库,怎么设置数据库连接属性?
openfire3.6.2集成现有系统用户
drop table test;
select count(*) from test;
--创建测试表
create table test
(
id number(9),
nick varchar2(30)
);
--插入测试数据
begin
for i in 1..100000 loop
insert into test(id) values(i);
end loop;
commit;
end;
select * from test;
--更新nick字段,使数据发生严重倾斜
update test set nick='abc' where rownum<99999;
--创建索引
create index idx_test_nick on test(nick);
update test set nick='def' where nick is null;
--只对索引进行分析
analyze index idx_test_nick compute statistics;
select * from user_indexes;
--查看索引名,对应存储的数据块,不同的key数量,记录数(行数)的分析信息
select index_name, LEAF_BLOCKS, DISTINCT_KEYS, NUM_ROWS
from user_indexes
where index_name = 'IDX_TEST_NICK';
--dba_tab_col_statistics
--查看表的统计信息
select COLUMN_NAME, NUM_BUCKETS, num_distinct
from USER_tab_columns
where table_name = 'TEST';
select * from test where nick ='abc';
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)
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的执行路径都是基于规则的,索引的字段的偏移
--先根据索引找到rowid,然后再根据rowid读取记录,这个过程肯定比全表扫描读取记录要慢
--user_part_col_statistics 分区分析信息
--分析表的第二列nick
analyze table test compute statistics for columns size 2 nick;
select * from test where nick ='abc';
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)
--根据上面的执行计划,还是按照规则来执行的
--分析表
analyze table test compute statistics for table;
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
1499970)
1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
99970)
--分析表之后,完全按照成本来执行
--删除所有的统计数据,并只对表与列进行分析,不分析索引,
--ORACLE使用CBO的优化器,并产生了正确的执行计划
analyze table test delete statistics;
--分析列nick
analyze table test compute statistics for table for columns size 2 nick;
select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
1499970)
1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
99970)
--
select * from test where nick ='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=30)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=2 Byt
es=30)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
=1 Card=2)
--创建TEST表ID列上的索引,但不对索引进行分析
create index idx_test_id on test(id);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 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'的值特别的多,所以不走IDX_TEST_NICK索引,走IDX_TEST_ID上的索引
select * from test where id=5 and nick='abc';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000
Bytes=15000)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
Card=400)
--当条件中即有id,又有nick时,因为nick上有直方图,ORACLE知道nick='def'的值特别的少,所以走IDX_TEST_NICK上的索引,不走IDX_TEST_ID索引
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=15)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
=1 Card=2)
select * from test where nick='def' and id=5;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=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
analyze table test compute statistics for columns size 1 id;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=7)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=7)
2 1 INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
Card=1)
/*
下面来看另外一种情况,我们删除所有的统计数据,然后在ID列上创建唯一索引,在此条件下,
只分析表与分析列nick,我们看到ORACLE走了正确的执行计划,
走了UK_TEST_ID,其实从这里也给我们带来很多的启示:
在主键与唯一键约束的列上是否需要直方图的问题?
如果在这些列上有像这样的查询where id > 100 and id < 1000,
我们还是需要有直方图的,但除此之外,好像真的没有直方图的必要了!
*/
analyze table test delete statistics;
drop index idx_test_id;
create unique index uk_test_id on test(id);
--分析表的第二列nick
analyze table test compute statistics for table for columns size 2 nick;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=15)
2 1 INDEX (UNIQUE SCAN) OF 'UK_TEST_ID' (UNIQUE) (Cost=1 Car
d=100000)
从以上一系列的实验可以看出,对ORACLE的优化器CBO来说,表的分析与列的分析才是最重要的,索引的分析次之。还有我们可以考虑我们的哪些列上需要直方图,对于bucket的个数问题,oracle的默认值是75个,所以根据你的应用规则,选择合适的桶数对性能也是有帮助的。因为不必要的桶的个数的大量增加,必然会带来SQL语句硬解析时产生执行计划的复杂度问题。
完全计算法: analyze table abc compute statistics;
抽样估算法(抽样20%): analyze table abc estimate statistics sample 20 percent
对表作完全计算所花的时间相当于做全表扫描,抽样估算法由于采用抽样,比完全计算法的生成统计速度要快,假如不是要求要有精确数据的话,尽量采用抽样分析法。建议对表分析采用抽样估算,对索引分析可以采用完全计算。
我们可以采用以下方法,对数据库的表和索引及簇表定期分析生成统计信息,保证应用的正常性能。
发表评论
-
oracle行转列
2014-12-02 16:01 591在写一些复杂的SQL的时候,经常需要使用到行变列的技巧,一些帐 ... -
oracle创建DB_link
2013-09-02 15:10 615create database link TTMS conne ... -
将Oracle中的表构造导出到word
2013-01-08 10:49 845将Oracle中的表结构导出到word 写开发文档时要用到数 ... -
Oracle 10g schedule job的常用操作
2012-05-10 22:05 816-- job 权限 grant cre ... -
oracle数据表闪回技术
2012-04-09 20:25 781第一步: show parameter undo --显示数 ... -
PL_SQL程序打包
2012-04-01 10:53 675PL/SQL 可以让我们把逻辑相关的类型、变量、游标和子程序放 ... -
存储过程异常处理
2012-04-01 10:47 694子程序很像一段小型的程序,由可选的声明部分,执行控制部分和可选 ... -
Oracle数据库的闪回技术
2012-01-03 10:07 25show parameter undo --显示数据库的闪回 ... -
开发软件常用工具包
2011-12-02 19:25 6401、jxls不错的处理excle工具包。 http://jxl ... -
查看Oracle执行计划的几种方法
2011-11-05 20:55 814一、通过PL/SQL Dev工具 1、直接Fil ... -
tomcat内存溢出的三种情况
2011-11-05 17:48 1120Tomcat内存溢出的原因 ... -
啤酒与尿布的故事
2011-08-30 12:59 1198(转)对于啤酒与尿 ... -
思维DW架构设计中的数据流架构规划
2011-08-30 12:56 1130数据仓库的架构看起 ... -
DB2的备份与恢复
2011-08-04 14:56 7861\ 数据库备份DB2 备份命令允许您在该命令执行时获取一个您 ... -
DB2递归查询
2011-07-05 15:28 1239在db2可以使用sql语句来进行递归查询,就是使用with语句 ... -
java实现文件转码
2011-05-11 22:57 1353非常好,解决了我的一个大问题。真是感谢。代码生成的java和j ... -
Group BY 的另一种写法
2011-04-20 19:39 762select * from temp_317 t1 执行 ... -
backup(自动备份数据库).cmd
2011-04-18 18:00 639if not exist %date:~0,4%%date: ... -
oracle常用视图查询
2011-01-27 23:13 980分析表 analyze table tablename com ... -
创建Oracle数据库
2011-01-24 21:30 783表空间CREATE SMALLFILE TABLESPACE ...
相关推荐
Oracle SQL是一种强大的数据库...通过逐一分析和运行这些示例,你不仅可以熟悉SQL语法,还能提升解决实际问题的能力。记住,实践是学习的最佳途径,动手尝试并理解每个示例背后的逻辑,将对你的SQL技能提升大有裨益。
Oracle分析函数的示例数据 其实也就是Mastering oracle sql书的SQL脚本
在这个“Oracle分析函数示例数据”中,我们有两个SQL脚本文件:user_order.sql和orders_tmp.sql,它们很可能是包含示例数据和查询的脚本,用于演示如何在实际场景中应用这些分析函数。 首先,让我们了解一下Oracle...
这些示例数据库包含了各种各样的表、视图、存储过程和其他数据库对象,用于演示和学习Oracle的功能。 1. **Oracle示例数据库OT**: OT(Oracle Technology)示例数据库是一个包含了多种业务场景的数据集合,包括...
本文详细分析了Java使用Jdbc连接Oracle数据库并执行简单查询操作的过程,并提供了一个简单的Java程序示例。同时,我们还讨论了使用PreparedStatement防止SQL注入的方法。通过本文,读者可以了解Java中Jdbc连接Oracle...
"HR"示例方案是Oracle数据库中的一个标准样例,它包含了一系列与人力资源管理相关的表,如员工、部门、职位等。这个方案通常用于教学和演示目的,展示了Oracle数据库在处理企业级数据时的复杂性和灵活性。 `hr_main...
在这个“JSP Oracle 用户管理 示例”中,我们可以探讨以下几个关键知识点: 1. **JSP基础**:JSP是基于Java的服务器端脚本语言,允许开发者在HTML或XML文档中嵌入Java代码,从而动态生成网页内容。JSP的主要组件...
"Oracle课件及示例代码"这个压缩包很可能是为了教学或自学Oracle数据库设计与管理而准备的资源集合。下面我们将深入探讨Oracle数据库的一些核心知识点,并结合示例代码来理解其应用。 1. **Oracle数据库基础**: -...
示例代码将演示如何查询单表或多表的数据,以及如何使用聚合函数(COUNT、SUM、AVG等)进行统计分析。 4. **数据操作**:插入数据使用`INSERT INTO`,更新使用`UPDATE`,删除使用`DELETE`。这些示例会展示如何正确...
在Oracle 9i 分析函数参考手册中,你可能会找到详细的函数用法、示例和最佳实践,帮助你更有效地利用这些功能。手册通常会涵盖函数语法、参数、返回类型以及如何解决常见问题。通过深入学习和实践,你可以掌握如何在...
然而,有时候我们需要将Oracle数据库中的表结构和内容导出到其他格式,例如Excel,以便于数据分析、报表制作或与其他系统进行数据交换。"导出Oracle表结构工具"就是这样一个实用程序,它简化了这个过程。 DBExport...
**JSP(JavaServer Pages)Oracle 成绩管理系统...在"课绩管理-第十三章示例程序"中,你可以找到实现上述功能的具体代码和配置,通过学习和实践,可以加深对JSP与Oracle结合应用的理解,并掌握成绩管理系统的开发技能。
而"DBExport2.51 For ORACLE.xls"则是一个示例或模板文件,展示导出后的Excel文件是如何呈现数据库表结构的。通过查看这个文件,用户可以预先了解导出的结果,以便于判断是否符合预期。 总之,"Oracle数据库表结构...
在大数据处理与分析领域,数据库表的性能优化显得尤为重要。特别是在面对大量历史数据时,合理地利用表分区技术可以显著提高查询效率,减少资源消耗。Oracle数据库提供了丰富的表分区功能,其中按月分区是一种常见的...
在Oracle数据库管理中,将表结构导出到Excel文件是一个常见的需求,这有助于数据分析、报告制作或数据共享。以下是一个详细的步骤指南,介绍如何完成这个任务。 首先,我们需要准备一个SQL查询来获取所需表的数据...
### Oracle 查看表空间表信息 在Oracle数据库管理中,了解如何查看表空间表信息是一项重要的技能。这有助于DBA(数据库管理员)或开发人员更好地理解数据库结构、优化查询性能以及进行必要的维护工作。 #### 标题...
### Oracle表空间查看知识点 #### 一、Oracle表空间概述 在Oracle数据库中,表空间是逻辑存储单元,用于组织和管理数据文件。一个表空间由一个或多个数据文件组成,而这些数据文件则存储在操作系统文件系统上。...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...
Oracle分析函数是数据库管理系统Oracle中的一个强大特性,它允许用户在SQL查询中执行复杂的分析操作。分析函数在处理报表和数据迁移任务时尤其有用,因为它们可以基于分组计算聚合值,并为每个分组返回多行,而不...