Oracle index 的运用
1 查看某张表的index的详细信息。(column_position代表选择顺序)
select table_name, index_name, column_name, column_position
from user_ind_columns
where table_name = 'T_BASE_DATA_DICTIONARY'
order by table_name, index_name, column_position;
2 在创建表时对列指定NOT NULL后会禁用NULL值,而且可以避免与使用NULL值相关的性能问题。(如:index :xxx is not null )
3将Oracle的ROWID硬编码成特定代码时,一定要小心谨慎。因为不同版本的ROWID结构会有所不同,而且在将来的版本里可能还会有所改变。我建议不要对ROWID进行硬编码
4通过改变所比较的列上的值,而不用改变列本身,就可以启用索引用。这样可避免全表扫描。
5对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,所以非常小因此您可以经常检索表中超过半数的行,并且仍使用位图索引.
在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对位图索引的存储和读取性能。
建议不要在一些联机事务处理(OLTP)应用程序中使用位图索引。B树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。位图索引存储为压缩的索引值,其中包含了一定范围的ROWID,因此Oracle必须针对一个给定值锁定所有范围内的ROWID。这种锁定类型可能在某些DML语句中造成死锁。SELECT语句不会受到这种锁定问题的影响。
位图索引有很多限制,如下所示:
● 基于规则的优化器不会考虑位图索引。
● 当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。
● 位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。
● 位图索引不能被声明为唯一索引。
● 位图索引的最大长度为30。
相关文档:
Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。 在SQL92标准中定义了几种外键改变后,如何处理子表记录的动作,其中包括:
限制Restrict:这种方式不允许对被参考的记录的键值执行更新或删除的操作;置为空Set to null ......
Oracle删除重复记录的最好的方法:
DELETE from EMP E WHERE E.ROWID > (SELECT MIN(y.ROWID)
from EMP y
WHERE y.EMPNO = E.EMPNO )
1、子查询找出某员工最低的ROWID(肯定只有一个),其它大于这条记录ROWID的,全部删除。
2、Oracle中使用ROWID删除重复记录最快,因为Rowid对应这条记录在磁盘上的位置
面试: ......
-- 查询某表的数据字典
SELECT A.TABLE_NAME AS "表名",A.COLUMN_NAME AS "字段名",
DECODE(A.CHAR_LENGTH,0,DECODE(A.DATA_SCALE,NULL,A.DATA_TYPE,A.DATA_TYPE||'('||A.DATA_PRECISION||','||A.DATA_SCALE||')'),
A.DATA_TYPE||'('||A.CHAR_LENGTH||')') as "字段类型1",A.DATA_TYPE AS "字段 ......
使用ultraedit32打开导出的dmp文件,文件内容以十六进制显示数据,其中第二、三字节的数据记录的是此文件的字符集。
例如:
03 54
将其转换为10进制,值为852,使用命令
select nls_charset_name(852) from dual
得到结果
ZHS16GBK
当前使用winXP简体中文操作系统,Oracle客户端默认字符集为GBK。
创建数据库,设定 ......
用oracle的卸载程序并不能完全卸载干净。如之前的命名的oracle sid 不能再使用。会提示sid存在。下面是在winxp下完全卸载oracle的方法。
1、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。
2、开始->程序->Oracle - OraHome81->Oracle ......