当前位置: 代码迷 >> Sql Server >> c++查sql server数据的速度太慢解决方案
  详细解决方案

c++查sql server数据的速度太慢解决方案

热度:118   发布时间:2016-04-24 08:50:28.0
c++查sql server数据的速度太慢
数据库表

现在的查询方法
int AdoDatabase::AdoQuery(const char* psz,memFunc myFunc)
{
int nRet = -1;

if (!m_bLink)
{
WriteLogFile("数据库断开");
return nRet;
}

do 
{
try
{
nRet = 0;
m_sql.m_pRecordPtr = m_sql.GetRecordSet(psz);
if (m_sql.m_pRecordPtr->adoEOF)
{
m_sql.m_pRecordPtr->Close();
break;
}

long count = 0;
_variant_t varTmp;
m_sql.m_pRecordPtr->MoveFirst();
m_sql.m_pRecordPtr->Fields->get_Count(&count);

while (!m_sql.m_pRecordPtr->adoEOF)
{
RecordRow strValue;
for (long i=0;i<count;i++)
{
_variant_t varIndex(i,VT_I4);
varTmp = m_sql.m_pRecordPtr->GetCollect(varIndex);
const int oldType = varTmp.vt;
strValue.push_back(varTmp);

}
myFunc(strValue);
m_sql.m_pRecordPtr->MoveNext();
nRet++;
}
m_sql.m_pRecordPtr->Close();
}
catch(const _com_error e)
{
nRet = -1;
WriteLogFile(psz);
}
} while (FALSE);
return nRet;
}


memFun函数只是将查到的数据存为流文件,实际上这个函数应该执行复杂的算法的,我为了测试查询速度先这样写的。

void myFunc(std::vector<_variant_t>& _dataRow)
{
std::vector<_variant_t>::const_iterator subIter;
for (subIter = _dataRow.begin();subIter!=_dataRow.end();++subIter)
{
const int nSize = 16;
char szColumn[nSize] = {0};
if (subIter->vt==VT_DECIMAL)
{
long lTmp = subIter->lVal;
_snprintf(szColumn,nSize,"%ld",lTmp);
}
else if (subIter->vt==VT_I4)
{
long lTmp = subIter->lVal;
_snprintf(szColumn,nSize,"%ld",lTmp);
}
else if (subIter->vt==VT_BSTR)
{
_bstr_t b = subIter->bstrVal;
char* psz = b;
_snprintf(szColumn,nSize,"%s",psz);
}
else if (subIter->vt==VT_R8)
{
double fTmp = subIter->dblVal;
_snprintf(szColumn,nSize,"%.2f",fTmp);
}
g_ofsLog<<szColumn<<"∮";
}
g_ofsLog<<std::endl;
}

从运行结果看,查询速度很慢。我查了1万条数据,花了4分钟。
我代码中可能要查好多条数据,例如查1000万条,那就需要4000分钟了,肯定不行啊。对查出的数据还要重复使用,各种算法计算它们。
目前我的解决方法是,查出数据存成流文件,然后再重复操作流文件。当然,存到内存也行。
现在的问题是:有什么方法可以优化数据库查询方法,可以是数据库本身的优化,也可以是c++代码的优化。只要快就好!
还望大神不吝赐教,良辰必有重谢。
------解决思路----------------------
先搞清楚是什么慢再说,纯ado操作速度怎么样?
			while (!m_sql.m_pRecordPtr->adoEOF)
{
//RecordRow strValue;
for (long i=0;i<count;i++)
{
//_variant_t varIndex(i,VT_I4);
//varTmp = m_sql.m_pRecordPtr->GetCollect(varIndex);
varTmp = m_sql.m_pRecordPtr->GetCollect(i);
//const int oldType = varTmp.vt;
//strValue.push_back(varTmp);

}
//myFunc(strValue);
m_sql.m_pRecordPtr->MoveNext();
nRet++;
}

------解决思路----------------------
ADO要用客户端游标。
------解决思路----------------------
直接在SQL环境中执行语句快的话估计是ADO游标的原因,改ADO游标试试
------解决思路----------------------

很有可能是访问数据本身就很慢,就是ADO来访问数据慢
------解决思路----------------------
你不要死搞 C++ , 先在数据库的查询分析器里查一下到底速度如何。

如果慢, 把语句、索引、执行计划贴出来, 大家好分析
  相关解决方案