oracledbf文件过大影响效率

oracledbf文件过大影响效率,第1张

ORACLE的DBF文件过大可能会影响数据库的效率,因为过大的DBF文件会导致 *** 作系统在读写数据时需要更长的时间,从而降低了数据库的性能。

为了解决这个问题,您可以考虑采取以下措施:

1 定期清理过期的数据:定期清理过期的数据可以减小数据库的存储空间,从而缩小DBF文件的大小。

2 优化数据库结构:优化数据库结构可以减少数据的冗余和重复,从而减小DBF文件的大小。

3 压缩DBF文件:使用压缩工具对DBF文件进行压缩也可以减小文件的大小,从而提高数据库的效率。

4 拆分DBF文件:如果DBF文件过大,可以将其拆分成多个小文件,这样可以提高数据库的存取速度。

5 配置自动增长:在配置数据库时,可以设置DBF文件的自动增长,这样可以避免文件过大的问题。

总之,针对DBF文件过大的问题,我们可以采取多种措施来解决。需要根据具体情况来选择最适合的方法,以提高数据库的效率。

oracle 优势很多,大部分银行保险电信大部分是用oracle处理的

优势主要 有

1、处理速度快,非常快

2、安全级别高。支持快闪以及完美的恢复,即使硬件坏了 也可以恢复到故障发前的1s

3、几台数据库做集群数据库,可以做到几秒s以内故障转移,而且数据物理完全一致,现在集群一直是最优秀的解决方案,对于银行保险没有其他太多的选项{数据不丢,快速切换,负载均衡}

4、网格控制,以及 数据仓库方面 也非常强大

对了免费 以及 开源的 言论 都是错误的。。。oracle产品及服务都是付费的,而且价格不菲。比其他数据库要贵,物有所值。oracle不是开源的。不过可以在redhat 或者其他开源 *** 作系统上安装。

mysql在sun没被oracle收购是开源的,免费的,之后oracle公司打算 把mysql打造成不开源,收费模式的。

通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。

下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。

1.对象的生成和大小的调整。

JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

例1:关于String ,StringBuffer,+和append

JAVA语言提供了对于String类型变量的 *** 作。但如果使用不当,会给程序的性能带来影响。如下面的语句:

String name=new String("HuangWeiFeng");

Systemoutprintln(name+"is my name");

看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和 *** 作:

(1) 生成新的字符串 new String(STR_1);

(2) 复制该字符串;

(3) 加载字符串常量"HuangWeiFeng"(STR_2);

(4) 调用字符串的构架器(Constructor);

(5) 保存该字符串到数组中(从位置0开始);

(6) 从javaioPrintStream类中得到静态的out变量;

(7) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(8) 复制该字符串缓冲变量;

(9) 调用字符串缓冲的构架器(Constructor);

(10) 保存该字符串缓冲到数组中(从位置1开始);

(11) 以STR_1为参数,调用字符串缓冲(StringBuffer)类中的append方法;

(12) 加载字符串常量"is my name"(STR_3);

(13) 以STR_3为参数,调用字符串缓冲(StringBuffer)类中的append方法;

(14) 对于STR_BUF_1执行toString命令;

(15) 调用out变量中的println方法,输出结果。

由此可以看出,这两行简单的代码,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些 *** 作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。

经修改,上面的代码可以用如下的代码来替换。

StringBuffer name=new StringBuffer("HuangWeiFeng");

Systemoutprintln(nameappend("is my name")toString());

系统将进行如下的 *** 作:

(1) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(2) 复制该字符串缓冲变量;

(3) 加载字符串常量"HuangWeiFeng"(STR_1);

(4) 调用字符串缓冲的构架器(Constructor);

(5) 保存该字符串缓冲到数组中(从位置1开始);

(6) 从javaioPrintStream类中得到静态的out变量;

(7) 加载STR_BUF_1;

(8) 加载字符串常量"is my name"(STR_2);

(9) 以STR_2为参数,调用字符串缓冲(StringBuffer)实例中的append方法;

(10) 对于STR_BUF_1执行toString命令(STR_3);

(11)调用out变量中的println方法,输出结果。

由此可以看出,经过改进后的代码只生成了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。

代码段1:

String name= new StringBuffer("HuangWeiFeng");

name+="is my";

name+="name";

代码段2:

StringBuffer name=new StringBuffer("HuangWeiFeng");

nameappend("is my");

nameappend("name")toString();

因此,充分的利用JAVA提供的库函数来优化程序,对提高JAVA程序的性能时非常重要的其注意点主要有如下几方面;

(1) 尽可能的使用静态变量(Static Class Variables)

如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。

例:

public class foo

{

 SomeObject so=new SomeObject();

}

就可以定义为:

public class foo

{

 static SomeObject so=new SomeObject();

}

(2) 不要对已生成的对象作过多的改变。

对于一些类(如:String类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。

例:

String name="Huang";

name="Wei";

name="Feng";

上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的 *** 作,性能将得更差,因为系统将不得为此生成更多得临时变量,如上例1所示。

(3) 生成对象时,要分配给它合理的空间和大小JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。

(4) 避免生成不太使用或生命周期短的对象或变量。对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。

(5) 只在对象作用范围内进行初始化。JAVA允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销。

例:

SomeObject so=new SomeObject();

If(x==1) then

{

 Foo=sogetXX();

}

可以修改为:

if(x==1) then

{

 SomeObject so=new SomeObject();

 Foo=sogetXX();

}

2.异常(Exceptions)

JAVA语言中提供了try/catch来发方便用户捕捉异常,进行异常的处理。但是如果使用不当,也会给JAVA程序的性能带来影响。因此,要注意以下两点:

(1) 避免对应用程序的逻辑使用try/catch

如果可以用if,while等逻辑语句来处理,那么就尽可能的不用try/catch语句。

(2) 重用异常

在必须要进行异常的处理时,要尽可能的重用已经存在的异常对象。以为在异常的处理中,生成一个异常对象要消耗掉大部分的时间。

3 线程(Threading)

一个高性能的应用程序中一般都会用到线程。因为线程能充分利用系统的资源。在其他线程因为等待硬盘或网络读写而 时,程序能继续处理和运行。但是对线程运用不当,也会影响程序的性能。

例2:正确使用Vector类

Vector主要用来保存各种类型的对象(包括相同类型和不同类型的对象)。但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。第一,Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。但是如果你已经确认你的应用程序是单线程,这些方法的同步就完全不必要了。第二,在Vector查找存储的各种对象时,常常要花很多的时间进行类型的匹配。而当这些对象都是同一类型时,这些匹配就完全不必要了。因此,有必要设计一个单线程的,保存特定类型对象的类或集合来替代Vector类用来替换的程序如下(StringVectorjava):

public class StringVector

{

 private String [] data;

 private int count;

 public StringVector()

 {

this(10); // default size is 10

 }

 public StringVector(int initialSize)

 {

data = new String[initialSize];

 }

 public void add(String str)

 {

 // ignore null strings

 if(str == null) { return; }

 ensureCapacity(count + 1);

 data[count++] = str;

 }

 private void ensureCapacity(int minCapacity)

 {

int oldCapacity = datalength;

if (minCapacity > oldCapacity)

{

 String oldData[] = data;

 int newCapacity = oldCapacity 2;

 data = new String[newCapacity];

 Systemarraycopy(oldData, 0, data, 0, count);

}

 }

 public void remove(String str)

 {

 if(str == null) { return; // ignore null str }

 for(int i = 0; i < count; i++)

 {

// check for a match

if(data[i]equals(str))

{

 Systemarraycopy(data,i+1,data,i,count-1); // copy data

 // allow previously valid array element be gc'd

 data[--count] = null;

 return;

}

 }

 }

 public final String getStringAt(int index)

 {

 if(index < 0) { return null; }

 else if(index > count) { return null; // index is > # strings }

 else { return data[index]; // index is good }

 }

}

因此,代码:

Vector Strings=new Vector();

Stringsadd("One");

Stringsadd("Two");

String Second=(String)StringselementAt(1);

可以用如下的代码替换:

StringVector Strings=new StringVector();

Stringsadd("One");

Stringsadd("Two");

String Second=StringsgetStringAt(1);

这样就可以通过优化线程来提高JAVA程序的性能。用于测试的程序如下(TestCollectionjava):

import javautilVector;

public class TestCollection

{

 public static void main(String args [])

 {

TestCollection collect = new TestCollection();

if(argslength == 0)

{

 Systemoutprintln("Usage: java TestCollection [ vector | stringvector ]");

 Systemexit(1);

}

if(args[0]equals("vector"))

{

 Vector store = new Vector();

 long start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++)

 {

storeaddElement("string");

 }

 long finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

 start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++)

 {

String result = (String)storeelementAt(i);

 }

 finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

}

else if(args[0]equals("stringvector"))

{

 StringVector store = new StringVector();

 long start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++) { storeadd("string"); }

 long finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

 start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++) {

String result = storegetStringAt(i);

 }

 finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

}

 }

}

关于线程的 *** 作,要注意如下几个方面:

(1) 防止过多的同步

如上所示,不必要的同步常常会造成程序性能的下降。因此,如果程序是单线程,则一定不要使用同步。

(2) 同步方法而不要同步整个代码段

对某个方法或函数进行同步比对整个代码段进行同步的性能要好。

(3) 对每个对象使用多”锁”的机制来增大并发。

一般每个对象都只有一个”锁”,这就表明如果两个线程执行一个对象的两个不同的同步方法时,会发生”死锁”。即使这两个方法并不共享任何资源。为了避免这个问题,可以对一个对象实行”多锁”的机制。如下所示:

class foo

{

 private static int var1;

 private static Object lock1=new Object();

 private static int var2;

 private static Object lock2=new Object();

 public static void increment1()

 {

synchronized(lock1)

{

 var1++;

}

 }

 public static void increment2()

 {

synchronized(lock2)

{

 var2++;

}

 }

}

4.输入和输出(I/O)

输入和输出包括很多方面,但涉及最多的是对硬盘,网络或数据库的读写 *** 作。对于读写 *** 作,又分为有缓存和没有缓存的;对于数据库的 *** 作,又可以有多种类型的JDBC驱动器可以选择。但无论怎样,都会给程序的性能带来影响。因此,需要注意如下几点:

(1) 使用输入输出缓冲

尽可能的多使用缓存。但如果要经常对缓存进行刷新(flush),则建议不要使用缓存。

(2) 输出流(Output Stream)和Unicode字符串

当时用Output Stream和Unicode字符串时,Write类的开销比较大。因为它要实现Unicode到字节(byte)的转换因此,如果可能的话,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用。

(3) 当需序列化时使用transient

当序列化一个类或对象时,对于那些原子类型(atomic)或可以重建的原素要表识为transient类型。这样就不用每一次都进行序列化。如果这些序列化的对象要在网络上传输,这一小小的改变对性能会有很大的提高。

(4) 使用高速缓存(Cache)

对于那些经常要使用而又不大变化的对象或数据,可以把它存储在高速缓存中。这样就可以提高访问的速度。这一点对于从数据库中返回的结果集尤其重要。

(5) 使用速度快的JDBC驱动器(Driver)

JAVA对访问数据库提供了四种方法。这其中有两种是JDBC驱动器。一种是用JAVA外包的本地驱动器;另一种是完全的JAVA驱动器。具体要使用哪一种得根据JAVA布署的环境和应用程序本身来定。

5一些其他的经验和技巧

(1) 使用局部变量。

(2) 避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量。

(3) 避免在循环中生成同一个变量或调用同一个函数(参数变量也一样)。

(4) 尽可能的使用static,final,private等关键字。

(5) 当复制大量数据时,使用Systemarraycopy()命令。

判断其实非常简单,找些人远程登录服务器,在服务器上开三十个登陆软件就可以了,这时候是本机登陆本机,不存在网络开销。

问题不在于这里,内网的话,网速应该不是问题,问题是你们的数据库究竟用来干什么,为什么会这么慢

你自己也应该知道做软件的辛苦,出了任何问题,所有的人不会从自己找原因,而是直接认为是软件部门的问题,这是十分简单粗暴的想法,但是也是我们进步的动力

如果远程登录也有速度慢的问题,那么就肯定是数据库本身有问题,如果没有,也不证明不是设置的问题

一个可能是数据库本身配置不当,或者系统配置不当,三百多g的数据库只不过是小型数据库的水平,我们一个中型数据库数t的数据,也没有登录一分钟的现象

一个问题可能是硬件的问题,比如你们内网其实是10m网卡,而数据吞吐量达到数百兆,或者硬盘读写速度跟不上

扯皮其实没有任何意义,以后你会知道,对于领导来说,需要的是尽快解决问题,解决不了的话,只会各打五十大板,尽快找到并且解决问题,才是最重要的,剩下的才是问题的责任问题

说个笑话你听,以前有两个市,都遭遇了洪水,一个市平常总是防洪做的很好,另一个市则不然,市长亲自出动到了抗洪第一线,结果最终,到了抗洪第一线的市长升职了,被无数老百姓称为青天,事实如何,你要掂量,要让所有的人感到你在用心做,尤其是要解决问题,这才是重要的

以上就是关于oracledbf文件过大影响效率全部的内容,包括:oracledbf文件过大影响效率、oracle数据库的优势有哪些、大虾请进:oracle数据库超大数据量的处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9740980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存