我现在数据库里有两个表,每个表里的数据都在200万条以上,在查询的时候速度很慢。现在我打算再新建两张一样的空表,然后将一个月以内的数据保存在新表中,每天定时刷新,定时刷新的工作为:将从今天算起一个月外的数据写入历史表中,再从本表中删除这些信息。
DBMS是ORACLE8,恳请大家给点建议,看看是不是还有更好的办法解决这个问题,或者关于写入删除等操作时要注意的地方。谢谢

解决方案 »

  1.   

    对 Oracle 来说 200万记录不算多,建议根据查询条件多建几个索引。
    还有你返回的结果有多少记录?如果返回的数据量大到是非常影响速度的!
      

  2.   

    没用过ORACLE8,以前都是用sql server中,我是这样做的:
    1.做一个存储过程,功能是生成一个新表,新表的名称就是运行这个存储过程的当前时间的前一天,例如“20050515”,再把原表中时间小于2005.05.16 00:00:00.000的数据全部复制到新表“20050515”中去,最后把原表中时间小于2005.05.16 00:00:00.000的数据全部删除。
    2.把这个存储过程添加到作业(jobs)中去,并设定每天凌晨4点钟触发这样就可以实现每日的数据都可以分表储存,而且操作全部是电脑自己完成的,不需要人干预。。估计ORACLE中应该也有差不多的功能,考虑一下吧。
      

  3.   

    TO: lsftest() 
    存储过程怎么添加到jobs中的,是不是做了一个exe文件?TO:sektor(普通动物)
    可否详细一点说下怎么完成够填满届面表格.后台继续传输。具个例子好吗?
      

  4.   

    TO: lsftest() 
    存储过程怎么添加到jobs中的,是不是做了一个exe文件?
    ======================================
    不是,我这里说的jobs并不是指window的任务调度,而是sql server自己的作业功能。。
    下面是sql server online book对调度作业的一些描述:调度作业
    调度管理作业是实现管理任务自动化的一种方式。可以调度本地作业或多服务器作业。可以定义作业在下列情况下运行: 每当 SQL Server 代理程序启动时。
    每当计算机的 CPU 使用率处于定义为空闲状态的水平时。
    在特定日期和时间运行一次。
    按循环调度运行。
    响应警报。 
    也可以手工执行一个作业;调度作业是可选的。说明  一次只能运行一个作业实例。若在一个作业按调度执行时手工执行它,则 SQL Server 代理程序会拒绝这个请求。
    默认情况下,所有作业都是启用的。为防止作业按照它的调度执行,必须禁用这个调度。此时这个作业仍然可以响应警报执行,或通过用户手工执行。SQL Server 代理程序自动禁用不再是当前的调度。若在调度被 SQL Server 代理程序禁用后对其进行编辑,则必须显式地重新启用它。在下列情况下,调度被禁用: 调度被定义为在某个特定日期和时间运行一次,而该时间已过。
    调度被定义为循环调度运行,而结束时间已过。 
    CPU 空闲调度
    为最大限度地利用 CPU 资源,可以为 SQL Server 代理程序定义一个 CPU 空闲状态。SQL Server 代理程序利用 CPU 空闲状态设置来决定执行作业的最佳时间。例如,可将每日备份作业调度到 CPU 空闲时及低业务量时进行。在把作业定义为在 CPU 空闲时执行之前,应确定作业所需的 CPU 工作量。可以使用 SQL 事件探查器或系统监视器(Windows NT 4.0 中的性能监视器)监视服务器流通并收集统计信息。可利用收集到的信息设置 CPU 空闲时间百分比。将 CPU 空闲状态定义为一个百分比,在该百分比以下,CPU 平均使用率必须保持指定的时间长度。下一步,设置这段时间长度。在超过该时间长度后,SQL Server 代理程序启动所有有 CPU 空闲时间调度的作业。调度作业企业管理器如何调度作业(企业管理器)
    调度作业 在详细信息窗格中,右击作业,单击"属性",单击"调度"选项卡,然后单击"新建调度"。
    在"名称"框中输入新调度的名称。 
    如果不希望调度在创建后立即生效,则清除"启用"选项。
    在"调度类型"下执行下列操作之一: 
    单击"启动SQL Server 代理程序时自动启动",在启动 SQL Server 代理服务时启动作业。
    单击"每当CPU闲置时启动",在 CPU 达到闲置条件时启动作业。
    如果希望调度运行一次,则单击"一次"。若要设置运行一次的调度,请在"发生日期"和"发生时间"框中输入值。
    如果希望调度反复运行,单击"反复出现"。若要设置反复出现的调度,请单击"更改"按钮,然后完成"编辑反复出现的作业调度"对话框。 
    Transact-SQLSQL-DMO禁用作业企业管理器如何禁用作业(企业管理器)
    禁用作业 在详细信息窗格中右击作业,然后单击"属性"命令。
    清除"启用"复选框。 
    Transact-SQLSQL-DMO设置 CPU 空闲时间和持续时间企业管理器如何设置 CPU 空闲时间和持续时间(企业管理器)
    设置 CPU 空闲时间和持续时间 展开服务器组,然后展开服务器。
    展开"管理",右击"SQL Server 代理程序",然后单击"属性"命令。
    单击"高级"选项卡,然后选择"计算机闲置的条件"复选框。
    在"CPU 闲置的条件"下执行下列操作: 
    指定平均的 CPU 使用必须低于的百分比(全部 CPU 间)。
    指定计算机达到闲置条件前经过的秒数。 请参见sp_help_jobschedulesysjobschedules
    查阅一下ORACLE的帮助文件吧,一定有这功能的。。
      

  5.   

    TO: lsftest() 
    谢谢你,我已经知道oracle里确实有这个功能,只是我们不能用,因为这个工作牵扯到9个外地oracle数据库和一个本地oracle,所以如果出错,就要写日志等出错处理,所以放弃了这个方法而改用写小程序来完成这个功能。现在的问题是速度问题,我听说过一些分页显示,这样就会提高效率,请问你知道这样怎么实现吗?正如我问sektor(普通动物)的:可否详细一点说下怎么完成够填满届面表格.后台继续传输。具个例子好吗?
    谢谢
      

  6.   

    每个表数据量200w并不大,而且你们还是oracle数据库
    是的,返回的数据一般都是几万条的,所以经常搞的没有响应,我想知道怎么才能让速度快一些。因为我要经常的刷新库存信息,需要刷新所有的数据信息,一条一条的刷新的,那么就是几百万条了,程序经常会没有响应,请给指点一下,谢谢
    --返回数据量是几万条,感觉这样太不合适了,其实每次需要的可能就是几千条记录,想象一下,一个界面几万条记录,怎么看啊,眼睛看花了,也看不到什么有用信息
    我们这面也有库存信息,但是都是由查询条件的,这样下来,数据量就不大了。刷新全部库存感觉好像在浪费服务器的资源。
      

  7.   

    TO: icedut(冰) 
    你说的不错,
    不过我现在想解决怎么分页显示,因为我首先要完成老板的任务啊!:(
      

  8.   

    在SQL Server中分页可以用这样的原理来写
    Select IDENTITY(numeric(9,0), 1,1) as px,* Into #Tmp from 表1 where 条件
    select * from #Tmp where px<记录1 and px>记录2
    Drop Table #Tmp
    多少页设好,代替记录
      

  9.   

    哦,对了,我记得ORACLE好象有RowID属性吧,想不起来了哦。有的话用它也行哦
      

  10.   

    ORACLE是有RowID,如果有rowid,那么该怎么做呢?
      

  11.   

    在SQL Server中分页可以用这样的原理来写
    Select IDENTITY(numeric(9,0), 1,1) as px,* Into #Tmp from 表1 where 条件
    select * from #Tmp where px<记录1 and px>记录2
    Drop Table #Tmp
    多少页设好,代替记录
    --
    分页可以解决
    不过中间的临时表#Tmp 数据量也很大的,如果上百万,就要加主键了,这样查询的时候会快一点
    其实分页就是相当于界面每次返回的数据量少一点阿搂主就按照 skywolfY(莫愁) 的方法改写一下好了,查一下oracle的相关语法阿