环境:VC (ODBC ) ,SQLSEVER2000 ,单文本的工程
我做的是算法, 当连接一个较大的表,如10k 行,运行到 frame 跳出来时,还没有运行算法,就报内存不足,我的PC内存为512M, 如果换小一些的表就没有问题.怎样才能解决呢?请各位高手帮帮忙,谢谢了.

解决方案 »

  1.   

    你是不是来了个SELECT * FROM 之类的语句?当然受不了。
    加上WHERE 限制返回的行数。减少记录集的大小。
      

  2.   

    除了在CMyView::OnInitialUpdate()打开数据库,我没有做其他的.就是直接运行,然后跳出窗体,还没有运行我的算法呢. 然后就是报内存不足.
        我还想知道的就是,在跳出FRAME时,系统已执行了那些函数.
        请各位高手再看看我的问题,谢谢
      

  3.   

    WHERE没有用!
    SQLl标准里是先生记录集合,然后才进行筛选的。看看你的SQL语句。想办法优化它。
      

  4.   

    转帖SQL版的一个FAQ怎样提高数据库的的执行速度。 
    ---------------------------------------------------------------  
    一、根据需求选择适当的数据库系统 。从数据规模、系统模式、用户环境等方面来考虑。  
    二、这一步最重要,一定要三思而后行。就是合理建表。  
    三、根据程序调用频次要求特别是数据统计报表等的要求,建立索引(这里建得好不好,就是速度好不好的主要原因了)。  
    四、不要将全部工作交给sql语句来做。特别是多表联合访问时更是这样,sql语句运行时第一步就是生成调用表的笛卡尔积,举个例子:比如你有两张表,各有记录10000条,表一是员工姓名,表二是员工工资。  当用联合查询时,笛卡尔积就是10000×10000=1亿。程序相当于是要在1亿条记录的集合里查找。    (注:有些朋友认为他已经通过where子句对数据进行了选择,所以问题没那么大,其实这是不对的,sql标准里是先生成笛卡尔积,然后才进行筛选的)。  
    五、程序中要重复利用可用的内存数据集。比如你有五个模块要调用表一,  如果你用五个数据集控件,那程序里就要初始化五次,当你数据集比较大时,  结果就知道了吧。所以写程序时,对一些常用的数据表或是查询,最好放在连接池中来管理  (cb中可以用datamodel)来代替。  
    六、优化sql。  这个就比较难了,三言两语也说不清楚,只能在平时慢慢积累,多看多学了。而且这个不同的数据库系统也不完全一样。  
    ---------------------------------------------------------------  
    性能调节的目的是通过将网络流通、磁盘  I/O  和  CPU  时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量。为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理  (OLTP)  与决策支持)权衡。  
     
    对性能问题的考虑应贯穿于开发阶段的全过程,不应只在最后实现系统时才考虑性能问题。许多使性能得到显著提高的性能事宜可通过开始时仔细设计得以实现。  SQL  Server的性能,必须在极为多样化的情形中识别出会使性能提升最多的区域,并对这些区域集中分析。  
     
    虽然其它系统级性能问题(如内存、硬件等)也是研究对象,但经验表明从这些方面获得的性能收益通常会增长。通常情况下,SQL  Server  自动管理可用的硬件资源,从而减少对大量的系统级手动调节任务的需求(以及从中所得的收益)。  
     
    据库设计如何成为提高总体性能的最有效途径。数据库设计包括逻辑数据库架构(如表和约束)和物理特性(如磁盘系统、对象位置和索引)。  
     
    描述正确设计的查询(用于应用程序)如何显著提高性能。  
     
    描述正确设计的用户应用程序如何显著提高性能。应用程序设计包括事务边界、锁定和批处理的使用。  
     
    描述如何更改操作系统(Microsoft  Windows  NT®、Microsoft  Windows®  95、Microsoft  Windows  98  或  Microsoft  Windows  2000)和  SQL  Server  的设置以提高总体性能。
      

  5.   

    用SQL查询10k行数据不会有问题的,
    应该是在界面
    输出太多记录导致的。
      

  6.   

    ??
    应该是Sql语句的问题吧 
    还有就是这两个表的结构完全一致么 
      

  7.   

    我做过的,100K的记录都有,也能正确读出来
    和SQL语句无关
    是你的显示方法不对,你是用什么方法把记录显示?
    如果是内存不足,说明你在显示记录的时候,消耗了大量的内存,检查一下那里的代码
      

  8.   

    恩,同意mfc168(子非鱼) 的还有一种情况是使用了非法的文件句柄,可能会使系统认为内存不足
      

  9.   

    mfc168(子非鱼) 说的是对的,不是表的问题.但是事实上我没有显示记录,就报了错误.
      我新建了一个工程试了一下,只连接了一个10k的表,没有报内存不足错误.
      可是我的工程要连接5个互相之间并不关联的表(属于同一数据库),于是我就见了5个CRecordset类,每个表对应一个.于是就有了下面的view类的初始化函数,我这样做连接没有问题,这样做会很耗内存吗?有没有不用建这么多CRecordset类的方法?
    请大家告诉我应该怎么做.谢谢关注
      void CMyView::OnInitialUpdate()
    {
    m_pSet = &GetDocument()->m_prefixSpanSet;   
             m_p1Set=&GetDocument()->m_seqpatterns;
    m_p2Set=&GetDocument()->m_kb;
    m_p3Set=&GetDocument()->m_db;
    m_p4Set=&GetDocument()->m_DB;
        ///////////////////////
    CRecordView::OnInitialUpdate();
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();
    ////////////////////////////////////////////////////////////////////////
    if(m_pSet->m_pDatabase->CanTransact())
    {
    m_pSet->m_pDatabase->BeginTrans();
    }
    m_pSet->Open();    
    m_p1Set->Open();
    m_p2Set->Open();
        //////////////////////  
    }