想使用oracle就必须忍受他的资源占用,如果机器不是用做服务器的话可以吧oracle的服务设置成手动,然后在使用是开启,下面是2个批处理用于启动和停止服务
;启动服务
net start OracleServiceORCL
net start OracleOraDb10g_home1TNSListener
pause
;停止服务
net stop OracleOraDb10g_home1TNSListener
net stop OracleServiceORCL
pause
数据表百万级的数据量,其实还是不是很大的,建立合理的索引就可以解决了。建立分区表的话,是可以根据所分区的内容进行查询的,比如单独查询2011年度的记录,但是因为你已经有了一定的历史数据,所以相对比较麻烦,建议百度一下。另外也可以将数据导出,然后重新建立需要分区的表,在建表的同时进行分区,这样再单独把数据导入就自动分区了
1、alter table tb nologging --若是归档模式下,将表设置为不记录日志
2、drop index index_name--若表上有index,先删除表上的index
3、insert /+append/ into tb --执行插入
4、create index index_name on --重建index
5、alter table tb logging --回复日志记录功能
前言 目前所有使用Oracle作为数据库支撑平台的应用 大部分数据量比较庞大的系统 即表的数据量一般情况下都是在百万级以上的数据量 当然在Oracle中创建分区是一种不错的选择 但是当你发现你的应用有多张表关联的时候 并且这些表大部分都是比较庞大 而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快 那么这个时候我考虑在Oracle中创建 临时表 我对临时表的理解 在Oracle中创建一张表 这个表不用于其他的什么功能 主要用于自己的软件系统一些特有功能才用的 而当你用完之后表中的数据就没用了 Oracle的临时表创建之后基本不占用表空间 如果你没有指定临时表(包括临时表的索引)存放的表空的时候 你插入到临时表的数据是存放在ORACLE系统的临时表空间中(TEMP) 临时表的创建 创建Oracle临时表 可以有两种类型的临时表 会话级的临时表和事务级的临时表 )会话级的临时表因为这这个临时表中的数据和你的当前会话有关系 当你当前SESSION不退出的情况下 临时表中的数据就还存在 而当你退出当前SESSION的时候 临时表中的数据就全部没有了 当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的 即两个不同的SESSION所插入的数据是互不相干的 当某一个SESSION退出之后临时表中的数据就被截断(truncate table 即数据清空)了 会话级的临时表创建方法 Create Global Temporary Table Table_Name(Col Type Col Type ) On Commit Preserve Rows 举例create global temporary table Student(Stu_id Number( ) Class_id Number( ) Stu_Name Varchar ( ) Stu_Memo varchar ( )) on Commit Preserve Rows ; )事务级临时表是指该临时表与事务相关 当进行事务提交或者事务回滚的时候 临时表中的数据将自行被截断 其他的内容和会话级的临时表的一致(包括退出SESSION的时候 事务级的临时表也会被自动截断) 事务级临时表的创建方法 Create Global Temporary Table Table_Name(Col Type Col Type ) On Commit Delete Rows 举例 create global temporary table Classes(Class_id Number( ) Class_Name Varchar ( ) Class_Memo varchar ( )) on Commit delete Rows ; ) 两种不通类型的临时表的区别 语法上 会话级临时表采用on mit preserve rows而事务级则采用on mit delete rows 用法上 会话级别只有当会话结束临时表中的数据才会被截断 而且事务级临时表则不管是mit rollback或者是会话结束 临时表中的数据都将被截断 例子 ) 会话级(Session关闭掉之后数据就没有了 当Commit的时候则数据还在 当Rollback的时候则数据也是一样被回滚) insert into student(stu_id class_id stu_name stu_memo) values( 张三 福建 );insert into student(stu_id class_id stu_name stu_memo) values( 刘德华 福州 );insert into student(stu_id class_id stu_name stu_memo) values( S H E 厦门 );SQL> select from student ;STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 S H E厦门 张惠妹 厦门SQL> mit;Commit pleteSQL> select from student ;STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 S H E厦门 张惠妹 厦门SQL>insert into student(stu_id class_id stu_name stu_memo) values( 张惠妹 厦门 ); row insertedSQL> select from student ;STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 S H E厦门 张惠妹 厦门 张惠妹 厦门SQL> rollback ;Rollback pleteSQL> select from student ;STU_ID CLASS_ID STU_NAME STU_MEMO 张三 福建 刘德华 福州 S H E厦门 张惠妹 厦门SQL> ) 事务级(Commit之后就删除数据) 本例子将采用以下的数据 insert into classes(Class_id Class_Name Class_Memo) values( 计算机 );insert into classes(Class_id Class_Name Class_Memo) values( 经济信息 );insert into classes(Class_id Class_Name Class_Memo) values( 经济信息 );在一个SESSION中(比如SQLPLUS登陆)插入上面 条记录 然后再以另外一个SESSION(用SQLPLUS再登陆一次)登陆 当你select from classes;的时候 classes表是空的 而你再第一次登陆的SQLPLUS中select的时候可以查询到 这个时候你没有进行mit或者rollback之前你可以对刚才插入的 条记录进行update delete等 *** 作 当你进行mit或者rollback的时候 这个时候由于你的表是事务级的临时表 那么在插入数据的session也看不到数据了 这个时候数据就已经被截断了 运行结果如下 SQL> insert intoclasses(Class_id Class_Name Class_Memo) values( 计算机 ); row insertedSQL> insert into classes(Class_id Class_Name Class_Memo) values( 经济信息 ); row insertedSQL> insert into classes(Class_id Class_Name Class_Memo) values( 经济信息 ); row insertedSQL> update classes set class_memo = where class_id= ; row updatedSQL> select from classes ;CLASS_ID CLASS_NAME CLASS_MEMO 计算机 经济信息 经济信息SQL> delete from classes where class_id= ; row deletedSQL> select from classes ;CLASS_ID CLASS_NAME CLASS_MEMO 计算机 经济信息 SQL> mit;Commit pleteSQL> select from classes ;CLASS_ID CLASS_NAME CLASS_MEMO SQL>再重复插入一次 然后rollback SQL> Rollback ;Rollback pleteSQL> select from classes ;CLASS_ID CLASS_NAME CLASS_MEMO SQL> 临时表的应用 ) 当某一个SQL语句关联的表在 张及以上 并且和一些小表关联 可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中 ) 程序执行过程中可能需要存放一些临时的数据 这些数据在整个程序的会话过程中都需要用的等等 注意事项 ) 临时表的索引以及对表的修改 删除等和正常的表是一致的 ) Oracle的临时表是Oracle i才支持的功能特性 如果你的Oracle版本比较低的话 那么就可能没有办法用到了 如果你的Oracle版本是 i的话 你还需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目录下的init<ORACLE_SID> ora初始参数配置文件的patible修改为patible = 我的服务器上就是这样子配置的 当然也可以修改为patible = 以上是我在对大表进行优化的时候采用的一些手段 效果显著 lishixinzhi/Article/program/Oracle/201311/18437
逐条数据插入INSERT
数据导入的最简单方法就是编写 INSERT 语句,将数据逐条插入数据库。这种方法只适合导入少量数据,如 SQLPlus 脚本创建某个表的种子数据。该方法的最大缺点就是导入速度缓慢,占用了大量的 CPU 处理时间,不适合大批量数据的导入;而其主要优点就是导入构思简单又有修改完善的d性,不需要多做其它的准备就可以使用。如果你有很多时间没法打发,又想折磨一下数据库和 CPU,那这种方法正适合你。
为了与其它方法做比较,现将十万条记录通过此方法导入到 CALLS 表中,总共消耗 172 秒,其中导入进程占用 CPU 时间为 52 秒。
逐条数据插入 INSERT,表暂无索引
为什么上一种方法占用了较多的 CPU 处理时间,关键是 CALLS 表中已创建了索引,当一条数据插入到表中时,Oracle 需要判别新数据与老数据在索引方面是否有冲突,同时要更新表中的所有索引,重复更新索引会消耗一定的时间。因此提高导入速度的好办法就是在创建表时先不创建索引或者在导入数据之前删除所有索引,在外部文件数据逐条插入到表中后再统一创建表的索引。这样导入速度会提高,同时创建的索引也很紧凑而有效,这一原则同样适用于位图索引(Bitmap Index)。对于主要的和唯一的关键约束(key constraints),可以使之先暂时失效(disabling)或者删除约束来获得同样的效果,当然这些做法会对已经存在的表的外键约束产生相关的影响,在删除前需要通盘斟酌。
需要说明的是,这种方法在表中已存在很多数据的情况下不太合适。例如表中已有九千万条数据,而此时需要追加插入一千万条数据,实际导入数据节省的时间将会被重新创建一亿条数据的索引所消耗殆尽,这是我们不希望得到的结果。但是,如果要导入数据的表是空的或导入的数据量比已有的数据量要大得多,那么导入数据节省的时间将会少量用于重新创建索引,这时该方法才可以考虑使用。 加快索引创建是另一个需要考虑的问题。为了减少索引创建中排序的工作时间,可以在当前会话中增加 SORT_AREA_SIZE 参数的大小,该参数允许当前会话在内存的索引创建过程中执行更多的排序 *** 作。同样还可以使用 NOLOGGING 关键字来减少因创建索引而生成的 REDO 日志量,NOLOGGING 关键字会对数据库的恢复和 Standby 备用数据库产生明显的影响,所以在使用之前要仔细斟酌,到底是速度优先还是稳定优先。
运用这种方法,先删除 CALLS 表的主键和不唯一的索引,然后逐条导入数据,完成后重新创建索引( 表在导入数据前是空的)。该方法总共消耗 130 秒,包括重建索引的时间,其中导入进程占用 CPU 时间为 35秒。
这种方法的优点是可以加快导入的速度并使索引更加紧凑有效;缺点是缺乏通用性,当你对表增加新的复杂的模式元素(索引、外键等)时你需要添加代码、修改导入执行程序。另外针对 724 在线要求的数据库在线导入 *** 作时,删除表的索引会对在线用户的查询有很大的性能影响,同时也要考虑,主要或唯一的关键约束条件的删除或失效可能会影响到引用它们的外键的使用。
批量插入,表暂无索引
在Oracle V6 中 OCI 编程接口加入了数组接口特性。数组 *** 作允许导入程序读取外部文件数据并解析后,向数据库提交SQL语句,批量插入 SQL 语句检索出的数据。Oracle 仅需要执行一次 SQL 语句,然后在内存中批量解析提供的数据。批量导入 *** 作比逐行插入重复 *** 作更有效率,这是因为只需一次解析 SQL 语句,一些数据绑订 *** 作以及程序与数据库之间来回的 *** 作都显著减少,而且数据库对每一条数据的 *** 作都是重复可知的,这给数据库提供了优化执行的可能。其优点是数据导入的总体时间明显减少,特别是进程占用 CPU 的时间。
需要提醒的是,通过 OCI 接口确实可以执行数据批量导入 *** 作,但是许多工具和脚本语言却不支持使用此功能。如果要使用该方法,需要研究你所使用的开发工具是否支持 OCI 批量 *** 作功能。导入程序需要进行复杂的编码并可能存在错误的风险,缺乏一定的d性。
运用上述方法,程序将外部数据提取到内存中的数组里,并执行批量插入 *** 作(100行/次),保留了表的删除/重建索引 *** 作,总的导入时间下降到 14 秒,而进程占用 CPU 的时间下降到7秒,可见实际导入数据所花费的时间显著下降了 95%。
select from table1 where xm like '%张%' and substr(bm, 1, 9)='201301111'
试试看这样 因为 oracle是从右开始匹配的 而 = 的速度 要快于 like(模糊查询) 的速度
以上就是关于oracle 数据库会占用大量资源导致电脑运行速度慢,有什么方法可以在不影响oracle的使用情况下提高速度。全部的内容,包括:oracle 数据库会占用大量资源导致电脑运行速度慢,有什么方法可以在不影响oracle的使用情况下提高速度。、oracle 数据库表数据量比较大,如何提升查询速度、如何提高Oracle数据库的插入速度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)