感谢各位大侠的热情回复!我在后台用sqlplus直接插了一条记录,速度很快。我是系统的维护人员,相当于网管,整个信息系统是买来的,我们没有源代码!前台运行程序的机器是刚换的一台新机器,操作系统是win98,以前还是挺快的,不知如何在数据库中改善这个状况。我现在的办法是将表中的数据倒出一部分到备份表,据前台应用人员讲稍微快点,但没有大幅提高。

解决方案 »

  1.   

    如果是delphi 写的客户程序,有个sqlmonitor可以直接在客户端进行监视,可以看到是哪句代码慢了
      

  2.   

    感谢各位的理解啊,确实超出我的范围,不过开发单位已经找不到了,或者找到也不会来的,(反正是让领导给坑了)。所以只好自己硬着头皮解决啊!承蒙最近andzen(阿风)的大力协助,给出了几个方法,进行了调整,不过好象问题还没有解决!还是慢啊!!
      

  3.   

    应该是前台应用程序写的不好导致的,可能是前台程序没有用sql语句更新或插入数据,而是直接open表,把数据都取到本地,再edit/append数据,最后再post数据引起的
      

  4.   

    针对你出现的问题,我发表一下看法,根据我的实际经验
    1:如果你在后台直接用INSERT 一条记录速度很快的话,那么基本可以肯定后台ORACLE性能应该没什么问题,如果直接在后台INSERT插入一条记录速度就慢的话,那么后台可能存在的原因就有好几种,有可能表空间性能严重下降,这是必须加大表空间或者采用这个办法(你先看一下后台你操作的那个表是否有触发器,约束之类的东西,如果有,那么保存一下定义,然后导出该表中所有数据EXP语句,为安全起见最好同时导出到文件(如ACCESS EXCEL等等没有图片的话)或SQL SERVER库(有图片的话)),在确保备份好所有数据之后,你可以TRUNCATE表,然后DROP掉这个表(提前导出一下这个表的SQL定义语句,方便后面 重新生成该表),然后重新建立这个表,然后再导入备份的数据,这样一般没什么问题,这个办法在我们实际中用到过好几次,效果特别好
    2:后台直接用指令INSERT插入的时候速度快,那么说明后台没问题,此时原因估计出于二 a:网络带宽小,传输调出的数据多(网线太长也可能有这个问题),所以慢,这个恐怕情况比较少见 b:客户开发的前台程序代码里面,是一个TABLE或QUERY数据集控件,而且里面采用的是一次打开所有数据(有些开发人员只考虑到当时调数据没问题,没想到以后几万,几十万调数据的时候怎么办),如果是这种情况,那么有两个办法解决,第一,如果这个表中以前很多历史数据不再操作,那么直接导入到另外一个表,这个表只保存近一段时间的数据,这个办法牺牲了历史数据统计和检索等功能,第二个办法可以解决这个问题,你新建一个表,比如原来表名叫SOURCETABLE,新建一个一摸一样的表叫REALTABLE,然后把所有数据导出到新建的REALTABLE表中,然后truncate SOURCETABLE表,然后drop sourcetable表(在导出到REALTABLE中之后)然后在REALTABLE上面建立一个视图,名字就叫sourcetable(必须叫这个),因为你前台程序里面调用是表名是这个,视图里面加上条件,只出现常用的数据,如  select * from realtable where 2004年以后的数据,根据实际情况调整就是
      

  5.   

    感谢各位大侠的热情回复!我在后台用sqlplus直接插了一条记录,速度很快。我是系统的维护人员,相当于网管,整个信息系统是买来的,我们没有源代码!前台运行程序的机器是刚换的一台新机器,操作系统是win98,以前还是挺快的,不知如何在数据库中改善这个状况。我现在的办法是将表中的数据倒出一部分到备份表,据前台应用人员讲稍微快点,但没有大幅提高。
    根据你这个回答,估计要么是表空间利用太高,不足的原因,要么是哪个勺货做程序的时候一次性打开了所有数据,导致系统性能严重下降,没有代码的情况下,要么转移数据,要么建立视图,视图里面定义少一点数据
      

  6.   

    多少秒?? 感觉 honeyboy(honeyboy) 写的比较全面,而且也可行! 当然,具体问题,还是要具体分析。
      

  7.   

    还有就是在倒出数据后,删除原表中过期数据的时候实在是太麻烦了。由于数据量较大,一般必须限在5-6天的范围内,超过这个范围就报回滚段不够,是不是因为oracle版本的问题啊。有没有好办法一次多删些。我都快成删除机器了。你想我要删除两年甚至三年的数据,但必须一次只删除五六天的,得多长时间啊。
      

  8.   

    不要使用delete ,直接使用 create table test as select * from sourcetable where 加上你需要的数据的条件即可。 然后再把 sourcetable 改名: rename sourcetable to newtable;然后把test 改成原表即可。
    rename test to sourcetable;
    并且创建相应的主键、外键和索引;
      

  9.   

    收缩一下回滚断,再试试。
    oracle有默认的回滚断空间