关于db_file_multiblock_read_count
一直觉得db_file_multiblock_read_count这个参数是个很神奇的参数,通过修改它可以改变ORACLE一次读的最大的块数,从而决定全表扫描的效率。下面是官方关于这个参数的说明:DB_FILE_MULTIBLOCK_READ_COUNT[@more@]DB_FILE_MULTIBLOCK_READ_COUNT is one of the parameters you can use to minimize I/O during table scans. It specifies the maximum number of blocks read in one I/O operation during a sequential scan. The total number of I/Os needed to perform a full table scan depends on such factors as the size of the t
关于INDEX SKIP SCAN
INDEX SKIP SCAN是9i之后提供的新功能,实现了即使WHERE条件中不存在索引的前导列也可以使用索引。但是INDEX SKIP SCAN是需要下面几个条件的:1,版本9i及以后2,CBO(表和索引都经过分析)3,索引的前导列重复值很少(选择性低)4,WHERE条件中不存在索引前导列[@more@]举例:1, 建立测试环境Sql>select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64biPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0
oracle中字符集列表
SELECT Nls_Charset_Id(Value) ,ValueFROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET';[@more@]1 US7ASCII2 WE8DEC3 WE8HP4 US8PC4375 WE8EBCDIC376 WE8EBCDIC5007 WE8EBCDIC11408 WE8EBCDIC2859 WE8EBCDIC114610 WE8PC85011 D7DEC12 F7DEC13 S7DEC14 E7DEC15 SF7ASCII16 NDK7DEC17 I7DEC18 NL7DEC19 CH7DEC20 YUG7ASCII21 SF7DEC22 TR7DEC23 IW7IS96025 IN8ISCII27 WE8EBCDIC114828 WE8PC85831 WE8ISO8859P132 EE8ISO8859P233 SE8ISO8859P334 NEE8ISO8859P435 CL8ISO8859P536 AR8ISO8859P637 EL8ISO8859P738 IW8ISO8859P839 W
关于USER_TABLES中的BLOCKS
我们知道数据库中的表分析后,查询USER_TABLES中的BLOCKS可以得到该表所占用的数据块的数量。那么,这个BLOCKS究竟是表中数据块的个数,还上表中所有块(数据块,位图块等)的个数呢?[@more@]SQL> create table sunwg_test (id varchar2(10));Table created.SQL> analyze table sunwg_test compute statistics;Table analyzed.SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from user_tables where table_name='SUNWG_TEST';0 0 7可以看出来此是表中没有数据,BLOCKS为0,说明这个BLOCKS是表中数据块的个数。从EMPTY_BLOCKS 等于7也
学习oracle的度
学习oracle的度无论做什么事情都要讲究一个“度”。喝酒要讲究度,工作要讲究度,娱乐要讲究度……学习oracle也是一样的。oracle的度主要有两个方面,广度和深度。广度就是指的知识面,而深度指的是对单一问题研究的深入程度。对oracle的掌握程度可以用下面的等式来表示:[@more@]oracle掌握程度 = oracle知识的广度 * oracle知识的深度可以看得出来一味追求广度和一味追求深度都是不合适的,两方面都要下工夫。举个例子来说吧,前一阵子一直做下面的测试,就是通过修改数据字典表交换两个相同结构表的内容。其实想想,应该是很简单的,一
利用sql_trace提高自学能力
我们都知道SQL_TRACE是一个SQL优化的工具,其实它也是一个可以帮助我们提高ORACLE水平的自学的好工具。在10G中出现了回收站(RECYCLEBIN)的概念,这样我们DROP后的也可以被恢复回来,例如:[@more@]SQL> create table test012 (id varchar2(10));Table createdSQL> insert into test01 values('001');1 row insertedSQL> commit;Commit completeSQL> drop table test01;Table droppedSQL> flashback table test01 to before drop;DoneSQL> select * from test01;ID----------001通过回收站就可以避免以前版本经常出现的
OBJECT_ID和DATA_OBJECT_ID
在USER_OBJECTS数据字典里面有两个字段:OBJECT_ID和DATA_OBJECT_ID。OBJECT_ID大家都比较熟悉,是每个数据对象的唯一标识。DATA_OBJECT_ID可能就用的少一些了,这个字段是和SEG$对应的,用来标识该OBJECT的物理存储的段的位置。[@more@]只有表,索引,UNDO这些有实在存储的对象才会对应一个物理的SEGMENT,字段DATA_OBJECT_ID才会有数值。象索引,函数等仅仅存在OBJECT_ID,而没有DATA_OBJECT_ID。SQL> create table test as select * from dual;Table created.SQL> select object_id,data_object_id from user_objects where obje
oracle的两个bug
前一阵子在网上查资料,看到了一个关于oracle日期类型的小bug。SQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE10.2.0.1.0 ProductionTNS for 32-bit Windows: Version 10.2.0.1.0 - ProductionNLSRTL Version 10.2.0.1.0 – Production[@more@]SQL> select 1 from dual where to_char(sysdate - 733021,'yyyy-mm-dd bc')=to_char(sysdate - 733022,'yyyy-mm-d
DATA BLOCK内部结构
block是oracle数据库中最基本的存储结构。盘区,段,数据文件都是由block构成的。一个oracle数据库中的block的大小在建立的数据库的时候就已经决定,在整个数据库的生命过程中不能修改;要修改block的大小只能重建数据库。查询数据库中block的大小:SQL> select value from v$parameter where name ='db_block_size';VALUE---------------------------------------------------------------------8192[@more@]数据库中block的大小从2k to 32k,而且必须是2k的指数倍,即2k,4k,8k,16k,32k。block的所能达到的最大值由操作系统决定。
用户资源管理DBMS_RESOURCE_MANAGER
用户资源管理DBMS_RESOURCE_MANAGER用户资源管理涉及到的数据包主要有两个:DBMS_RESOURCE_MANAGER和DBMS_RESOURCE_MANAGER _PRIVS。其中包DBMS_RESOURCE_MANAGER主要是用于建立资源计划,建立资源用户组,建立资源分配方法等用户资源相关的管理;而DBMS_RESOURCE_MANAGER _PRIVS的主要用途是进行用户资源管理的权限控制。[@more@]一、前言资源管理器有三个部件组成:资源用户组(Resource consumer group )、资源规划(Resource plan )、资源分配方法(Resource allocation method)及资源计划目录(Resource plan directives) 。它们的
What the RBO rules don't tell you
前言下面的20条就是RBO的优化规则: Rank Condition 1 ROWID = constant 2 Cluster join with unique or primary key = constant 3 Hash cluster key with unique or primary key = constant 4 Entire Unique concatenated index = constant 5 Unique indexed column = constant 6 Entire cluster key = corresponding cluster key of another table in the same cluster 7 Hash cluster key = constant 8 Entire cluster key = constant [@more@]9 Entire non-UNIQUE CONCATENATED index = constant 10 Non-UNIQUE index merge 11 Entire
Oracle的验证方式
一基本概念Oracle的验证方式分为两种:操作系统验证和密码验证。操作系统验证的意思就是利用操作系统的帐户密码系统来保护oracle数据库的安全,一般的生产系统只有dba才拥有操作系统的帐户,所以用操作系统验证很方便并且具有很高的安全性。密码验证就是通过oracle的密码文件来保证oracle数据库的安全性。判断当前数据库采用何种验证方式的最简单的方法就是:1, 在命令行中输入“sqlplusw /nolog”,以nolog方式登陆到sqlplus2, 输入命令“conn / as sysdba”如果提示“已连接”则当前采用的验证方式为操作系统严整;如果出现错误提示则
ORACLE非归档下的恢复
非归档模式1, 参数文件丢失1) 数据库是用spfile启动的情况下,init.ora丢失,不会对数据库的启动产生任何影响,不过为了安全考虑,应该重新创建init.ora,作为spfile的备份。create pfile = 'D:oracleadminmyoracle[@more@]一2) 数据库用spfile启动的情况下,spfile文件丢失a, 存在init.ora参数文件的备份,可以用pfile直接启动,也可以用pfile创建spfile,然后用spfile启动直接用pfile启动startup pfile=’ D:oracleadminmyoraclepfileinit.ora’重新创建spfile,用spfile启动create spfile from pfile=’ D:oracleadminmyoraclepfil
ORACLE优化器
一 ORACLE优化器概述ORACLE优化器是用于生成SQL语句访问数据库时使用的执行计划的。ORACLE优化器通过使用ORACLE搜集的关于数据库对象的统计数据来生成SQL语句的访问计划(使用什么对象)并执行计划(使用何种操作)[@more@]二 ORACLE优化器的分类ORACLE优化器分为三类:1) RULE优化器:基于规则的优化器相对比较简单,通过检查数据库的可用路径并将这些路径与路径表进行比较,从而确定SQL语句的执行计划。RULE优化的过程中不需要任何表或索引的统计信息,而且也会忽略任何表或索引的统计信息2) COST优化器:基于开销的优化器相对比较复杂
Oracle优化工具——AutoTrace
SQLPLUS的AutoTrace是分析SQL的执行计划,执行效率的一个非常简单方便的工具,在绝大多数情况下,也是非常有用的工具。利用AutoTrace工具提供的SQL执行计划和执行状态可以为我们优化SQL的时候提供优化的依据,以及优化效果的明显的对比效果。[@more@]一. AutoTrace的设置SQL> connect / as sysdba SQL> @?/rdbms/admin/utlxplan.sql Table created. SQL> create public synonym plan_table for plan_table; Synonym created. SQL> grant select,update,insert,delete on plan_table to public;Grant succeeded. SQL> @?/s
Sga的结构
共享池:“共享池”指定共享池的大小。共享池包含共享游标、存储的过程、控制结构、并行执行消息缓冲区以及其它内容。值越大,多用户系统的性能就越好。值越小,使用的内存就越少。该值被指定为初始化文件参数 SHARED_POOL_SIZE。注:SHARED_POOL_SIZE的值越大,可以缓存的游标,sql就越多,数据库的速度越快;过大的SHARED_POOL_SIZE会导致latch的争用,会导致严重的性能问题。这个参数的修改要慎重,要对系统有个全面的了解后才能修改。[@more@]缓冲区高速缓存:“缓冲区高速缓存”指定数据库缓冲区高速缓存中的缓冲区数。高速缓存中的每
常用的数据字典视图和包
一 数据字典视图概述数据字典是ORACLE数据库的核心组成部分,数据库中的用户信息,表信息,索引信息,权限信息等一切数据库运行必须要的数据都是保存在数据字典里面。数据字典的OWNER为SYS,所以访问起来不是很方便,而且里面的数据也很难直接读懂。为了可以方便的得到数据字典的信息,ORACLE建立大量的数据字典视图方便我们的查询。[@more@]常用的数据字典视图大体上分为两类:1) 静态的数据字典视图:以DBA_,ALL_,USER_开头的视图,这些视图里面的数据相对来说比较问题很少变化。2) 动态的数据字典视图:以V_开头的视图,这些视图里面
关于count(*)
关于count(*)的执行计划的分析一.RULE优化器(RBO)1, 表上无索引SQL> create table test01 as select * from dba_objects;Table createdSQL> select count(*) from test01;已用时间: 00: 00: 00.05[@more@]Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 SORT (AGGREGATE)2 1 TABLE ACCESS (FULL) OF 'TEST01'SQL> select count(*) from test01 where object_id > 0;已用时间: 00: 00: 00.03Execution Plan------------------------------------------
视图的依赖性
视图是一个基于其他对象的查询语句,这里的其他对象包括表,视图,实体化视图.通过视图可以得到以下好处:1,提供表级别的安全性2,隐藏数据的复杂性3,提供简单的语句给用户4,提供比基表更高的灵活性5,保存复杂的查询[@more@]视图和构建视图的表或其他对象存在很强依赖关系,基表的改变会对视图产生很大的影响.这里以基于表的视图为例,说明一下视图的依赖性.前提准备一基表的建立SQL> drop table test01;Table droppedSQL> create table test012 (id varchar2(3));Table created二视图的建立SQL> drop view view_test01;View droppedSQL
手工创建oracle数据库的过程
数据库: Oracle 8i R2 (8.1.6) 安装路径:d:oracleora81 数据库实例:mytest 数据库全局名称:mytest.world 步骤一:手工创建相关目录这些目录是新建数据库的一些必要的文件夹之类,比如初始化参数文件夹,udump文件夹,数据文件文件夹等等,下面列出的是一个最基本的目录表[@more@]数据库: Oracle 8i R2 (8.1.6) 安装路径:d:oracleora81 数据库实例:mytest 数据库全局名称:mytest.world 步骤一:手工创建相关目录这些目录是新建数据库的一些必要的文件夹之类,比如初始化参数文件夹,udump文件夹,数据文件文件夹等等,下面列出的