关于函数索引(function-based index)
函数索引是从8i开始提供的,有了函数索引就可以在索引中使用函数或者表达式了。例:SQL> create table sunwg (id varchar2(10));Table created.[@more@]SQL> insert into sunwg values('a');1 row created.SQL> commit;Commit complete.SQL>create index ind_sunwg on sunwg(id);SQL>select * from sunwg where upper(id) = ‘TOM’;这样的情况下,这个SQL是不会走索引的,因为在ID上面存在函数UPPER,所以只能走全表扫描。但是利用函数索引,上面的SQL也是可以走索引的。SQL>drop index ind_sunwg;SQL>create index
2007年的最后一天
2007年的最后一天今天是2007年的最后一天。这一年中在我身上发生了很多事情,有悲伤的,有快乐的,总得来说还是有收获的。事情太多了,都不知道怎么来写。就随便挑几件大事说说吧,算是给自己留个纪念。年初的时候,我失去了一份原以为足够坚固的感情,四年多个感情就在一夜间灰飞湮灭了。记得开分手的时候,我总是会想起她,想起以前快乐的日子。时间长了,我也想明白了,人各有志,道不同不相为谋。这样也好,总比真的结婚之后在发现要好得多吧。只有有些感伤,在金钱面前,感情是那么的脆弱,有得时候一千块前比多年的感情还有来得重要
oracle中的几个hash函数
ORACLE 中提供了几种HASH的函数,主要包括下面三种MD4,MD5,SH1。我知道常用的函数调用方法如下:1, 这个函数不知道具体的哪种算法,不过这个应该是最常用的一个HASH函数了select dbms_utility.get_hash_value('1',1,100) from dual;2, HASH_MD4 (128 bit hash)select dbms_crypto.hash('aaaa',1) from dual;3, HASH_MD5 (128 bit hash)select dbms_crypto.hash('aaaa',2) from dual;4, HASH_SH1 (160 bit hash)select dbms_crypto.hash('aaaa',3) from dual;[@more@]其实还有一个加密的函数DBMS_OBFUSCATION_TOOLKIT.md5,这个就
常见SQL访问索引的方式
以下是ORACLE中常见的SQL访问索引的方式[@more@]索引范围扫描 INDEX RANGE SCAN 索引唯一扫描 INDEX UNIQUE SCAN 索引全扫描(min/max) INDEX FULL SCAN(MIN/MAX) 索引快速全扫描 INDEX FAST FULL SCAN 索引全扫描 INDEX FULL SCAN 索引跳跃扫描 INDEX SKIP SCAN 索引连接 INDEX JOIN其他的都很好理解的,我只说明下索引快速全扫描和索引全扫描的区别。索引快速全扫描 的方式可全表扫描很象,是多块读的,它会连同根结点和
关于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知识的深度可以看得出来一味追求广度和一味追求深度都是不合适的,两方面都要下工夫。举个例子来说吧,前一阵子一直做下面的测试,就是通过修改数据字典表交换两个相同结构表的内容。其实想想,应该是很简单的,一
SYBASE IQ简介
SYBASE IQ是SYBASE公司开发的基于列存储的数据库,与我们平时使用的关系型数据库有很大的差异。我们平时使用的ORACLE,DB2等关系型数据库是基于行来存储的,表的组织单位是行,是记录;而IQ中的表是按照列来存储的,表中一列的数据是放到一起的。[@more@]形象点说明的话,传统关系型数据库一个表(非分区表)只对应一个SEGMENT,因为是按照行来组织;而IQ中,每一个列会对应一个SEGMENT,那么一个表就会对应多个SEGMENT。按列存储有着几个明显的优势:1,我们SQL一般仅仅关心表中的几个字段,对于IQ来说,它仅仅会扫描那些用户关系的列,而
利用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