Oracle新手入门:如何提高索引创建速度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle新手入门:如何提高索引创建速度?相关的知识,希望对你有一定的参考价值。
默认情况下,数据库系统是不允许DML操作与创建索引的操作同时进行的。也就是说,在创建索引的过程中,是不允许其他用户对其所涉及的表进行任何的DML操作。这主要是因为对基础表进行DML操作时,会对基础表进行加锁。所以在基础表上的DDL事务没有递交之前,即没有对基础表进行解锁之前,是无法对这基础表创建索引的。反之亦然。显然此时数据库没有采用这个ONLIE选项,继之DML操作与创建索引操作同时进行,主要是从创建索引的效率出发的。防止因为两个作业相互冲突,从而延长某个作业的运行时间。但是有时会我们必须允许他们进行同时操作。如用户可能一刻都不能够离开数据库系统,需要时时刻刻对数据库基础表进行DML操作。而此时由于某些原因,数据库管理员又需要重新建立索引时,那么不得不在创建索引的语句中加入这个ONLINE选项。让他们同时运行。此时虽然可能会延长索引创建作业的时间,但是可以保障用户DML操作能够正常进行。有时候牺牲这个代价是值得的。用户是不能够等的,而我们数据库管理员则可以勉强的等一会儿。当然,如果用户对于这个DML操作及时性没有这么高。如数据库管理员在晚上员工没有使用数据库时创建索引时,则可以不带这个选项。在限制用户对基础表进行DML操作的同时,提高数据库创建索引的效率。可选项五:PARALLEL,多服务进程创建索引默认情况下,Oracle数据库系统不采用这个选项。这并不是说这个选项不可用,而是因为大多数情况下企业部署Oracle数据库时所采用的数据库服务器往往只有单个CPU。此时数据库系统是用一个服务进程来创建索引的。如果企业的服务器有多个CPU的话,则可以在创建索引时采用这个选项。因为只要采用了这个选项,则数据库就会使用多个服务进程来并行的创建索引,以提高索引创建的速度。为此,在同等条件下,多服务并行创建进索引并单服务创建索引速度要快的多。所以如果服务器中有多个CPU,而且需要创建的索引比较多或者基础表中记录比较多的话,则采用这个选项能够大幅度的提高索引的创建效率。故笔者建议,如果采用多CPU的服务器时,最好在创建索引时使用这个选项。不能够浪费了服务器的CPU呀。不然的话,多CPU服务器的优势就体现不出来了。为此采用这个选项,也是物尽其用。希望本文讲到的内容对大家能有所帮助。 参考技术A 索引创建速度取决于两个方面:1、主机性能。
2、减少数据表中数据量。
针对第一种情况:可适当增加主机内存,更换CPU等。
针对第二种情况:
1、将原表中数据转移到其他备份表中。
2、给原表创建索引。
3、将备份表中数据重新导回。
oracle创建索引语法:
Create[UNIQUE|BITMAP]index
[schema.]index_nameon[schema.]table_name(column_name[ASC|DESC],…n,[column_expression])|CLUSTER[schema.]cluster_name
[INITRANSinteger]
[MAXTRANSinteger]
[PCTFREEinteger]
[PCTUESDinteger]
[TABLESPACEtablespace_name]
[STORAGEstorage_clause]
[NOSORT]
[REVERSE] 参考技术B 以下脚本可以用于加速大表索引的创建或重建
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
-- Script Tested above 10g
-- Create a new temporary segment tablespace specifically for creating the index.
-- CREATE TEMPORARY TABLESPACE tempindex tempfile 'filename' SIZE 20G ;
-- ALTER USER username TEMPORARY TABLESPACE tempindex;
REM PARALLEL_EXECUTION_MESSAGE_SIZE can be increased to improve throughput.
REM but need restart instance,and should be same in RAC environment
REM this doesn't make sense,unless high parallel degree
-- alter system set parallel_execution_message_size=65535 scope=spfile;
alter session set workarea_size_policy=MANUAL;
alter session set workarea_size_policy=MANUAL;
alter session set db_file_multiblock_read_count=512;
alter session set db_file_multiblock_read_count=512;
--In conclusion, in order to have the least amount of direct operations and
--have the maximum possible read/write batches these are the parameters to set:
alter session set events '10351 trace name context forever, level 128';
REM set sort_area_size to 700M or 1.6 * table_size
REM 10g bug need to set sort_area_size twice
REM remember large sort area size doesn't mean better performance
REM sometimes you should reduce below setting,and then sort may benefit from disk sort
REM and attention to avoid PGA swap
alter session set sort_area_size=734003200;
alter session set sort_area_size=734003200;
REM set sort area first,and then set SMRC for parallel slave
REM Setting this parameter can activate our previous setting of sort_area_size
REM and we can have large sort multiblock read counts.
alter session set "_sort_multiblock_read_count"=128;
alter session set "_sort_multiblock_read_count"=128;
alter session enable parallel ddl;
create [UNIQUE] index ... [ONLINE] parallel [Np] nologging;
alter index .. logging;
alter index .. noparallel;
如果自己搞不定可以找ASKMACLEAN专业ORACLE数据库修复团队成员帮您恢复!
oracle查询数据速度慢,已建索引的。求助
方法如下:Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);
例如:
create index index_userid on tbl_detail(userid);
如何找数据库表的主键字段的名称?
SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE=\'P\' and table_name=\'AAA\'; select * from dba_cons_columns where CONSTRAINT_NAME=\'SYS_AAA\';
Oracle 在创建主键(可以不加constraint SYS_AAA),会为库表自动创建索引,
索引的列为主键列。 并且当库表某些列名或者库表名改变时候,
Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns
desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS
例子1:更改库表的列名
ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) );
//查找约束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name =\'AAA\' AND C.CONSTRAINT_TYPE=\'P\';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME ------------------------------ ------------ ------------- SYS_AAA AAA ID
//查找索引
select index_name,index_type,uniqueness from user_indexes where table_name=\'AAA\'; INDEX_NAME INDEX_TYPE UNIQUENES 参考技术A 如果你的id 字符长度是一样的话
可以是试一下直接 select max(id) from 表 ,看看速度。
可以把pga改大一点追问
这样的话速度就很快,但查到的值不是需要的值
参考技术B 1、可以尝试重建索引;2、删掉不必要的数据,减少数据量;
3、分区分表。追问
嗯,试了,查询的字段是varchar2型,这个字段全是数字,查询语句是select Max(to_number(id)) from 表;速度好慢,求解
以上是关于Oracle新手入门:如何提高索引创建速度?的主要内容,如果未能解决你的问题,请参考以下文章