用的是VC+SQLServer2000,表里边一条符合条件的记录也没有时也会出现100%
就是下边这段代码:
_ConnectionPtr m_pConn;
_RecordsetPtr m_pSetg;
m_pConn.CreateInstance(__uuidof(Connection));
m_pSetg.CreateInstance(__uuidof(Recordset));

m_pConn->Open("Provider=SQLOLEDB;Data Source=CHINAVAS;Initial Catalog=TelQQMY; User ID=sa;Password=;","","",NULL); CString strSqlg;
strSqlg.Format("select  * from voicemail where delstatus = 1 and outstatus = 0 order by lsh asc");
    BSTR strSQLg=strSqlg.AllocSysString();
m_pSetg->Open(strSQLg,(IDispatch*)m_pConn,adOpenDynamic,adLockOptimistic,adCmdText); 

strSqlg.Empty();
if( m_pSetg->adoEOF && m_pSetg->BOF )//发送用户点歌和用户语音短信!
{
if( m_pSetg->State )
{
m_pSetg->Close();
}
if( m_pConn->State )
{
m_pConn->Close();
}
delete [] send;
delete [] tmpno;
return;
}
else
{
m_pSetg->MoveFirst();
} for( SendTrunk; SendTrunk < MAXSENDTRUNK; SendTrunk++ )
{
if( ! m_pSetg->adoEOF)
{
if( (TRK_FREE == Trunk[SendTrunk].State)&&( ISUP_CH_FREE == DJISUP_GetChnState( SendTrunk/30, SendTrunk%30)) )
{
tmp = m_pSetg->GetCollect(_variant_t( "sendto" ));
tmplsh = m_pSetg->GetCollect(_variant_t( "lsh" ));
lsht = tmplsh.lVal;
strcpy(send,(char*)(_bstr_t)tmp);
len = strlen(send); if( len < 8 )
{
if( yzGetTelByQQ( atoi(send),tmpno ) )
{
strcpy(Trunk[SendTrunk].callerno,tmpno);
strcpy(Trunk[SendTrunk].callee,(char*)(_bstr_t)m_pSetg->GetCollect(_variant_t("caller")));
strcpy(Trunk[SendTrunk].filename,(char*)(_bstr_t)m_pSetg->GetCollect(_variant_t("vm_dir")));
          Trunk[SendTrunk].lsh = lsht;
temp = Trunk[SendTrunk].callee;
                if( temp.Find('F') > 0 )
{
temp.Delete( 0, 12 );
strcpy( Trunk[SendTrunk].callee , temp.GetBuffer(0) );
temp.Empty();
Trunk[SendTrunk].voice_type = 2;
}
else
{
Trunk[SendTrunk].voice_type = 1;
}
Trunk[SendTrunk].State = TRK_MESSAGE_SENDING_CALLOUT;
yzSendMessageProcess( lsht);
m_pSetg->MoveNext();
}
else
{
// strcpy( tmpno, (char*)(_bstr_t)m_pSetg->GetCollect(_variant_t( "vm_dir" )));
            yzSendMessageFailed(lsht);
m_pSetg->MoveNext();
}
}
else if( (len >= 8)&&(len <= 12))
{
strcpy(Trunk[SendTrunk].callerno,send);
strcpy(Trunk[SendTrunk].callee,(char*)(_bstr_t)m_pSetg->GetCollect(_variant_t("caller")));
strcpy(Trunk[SendTrunk].filename,(char*)(_bstr_t)m_pSetg->GetCollect(_variant_t("vm_dir")));
                    temp = Trunk[SendTrunk].callee;
if( temp.Find('F') > 0 )
{
temp.Delete( 0, 12 );
strcpy( Trunk[SendTrunk].callee , temp.GetBuffer(0) );
temp.Empty();
Trunk[SendTrunk].voice_type = 2;
}
else
{
Trunk[SendTrunk].voice_type = 1;
}

yzSendMessageProcess( lsht);
m_pSetg->MoveNext();
}
else
{
yzSendMessageFailed(lsht);
m_pSetg->MoveNext();
} } }
else
{
break; }
}
delete [] send;
delete [] tmpno;
return;

解决方案 »

  1.   

    无从下手啊,是数据库查询open时耗cpu还是查询完成结束之后啊
      

  2.   

    应该是数据库open时,比较费时!
      

  3.   

    应该使用或,而不是与,试试:
    if( m_pSetg->adoEOF || m_pSetg->BOF )//发送用户点歌和用户语音短信!
      

  4.   

    如果是open的问题,你把sql语句单独执行一下,看看执行时间,如果问题出在这估计是你的where条件的字段的问题
      

  5.   

    这个表数据变化很大,所以用index不合算吧!
      

  6.   

    同问我以前做的程序用的是oracle,也是开库的时候比较慢,不知道为什么?是不是和数据库的设置有关系?
      

  7.   

    我分析了一下,以下几个原因
    1. 表记录数较多,而且没有索引,速度肯定受影响,如果这个表不会非常频繁的插入删除的话,建议加一个索引。(即使频繁插入,在10万条记录情况下更新索引耗费的时间我觉得应该可以承受,你可以试验一下)2. 表如果操作频繁,是否进行重新组织操作,我sqlserver不太熟,不知如何操作,类似于windows下的磁盘碎片整理。3. 筛选条件,看你的筛选结果与与总记录数,对比一下,如果10万条筛选万还剩7万条的话,那么即使加了索引也不会使用索引了,此时可以适当调整数据库设计,对你这条语句,可以干脆不加条件,取出来后用程序删除。