问题描述
我从数据库中提取数据,一张表约500W条数据,有19列,按人员标识来查询的话正常2秒能出来结果,如果select*来绑定到datagridview的话,就会连接超时,但有时也能查出结果来.因为一些需求不用分页和虚拟模式显示,求一些解决超时问题的经验?
解决方案
解决方案二:
19列你要全部显示?减少查询字段的个数,可以提高查询效率,另外你至少有个查询条件限制,否则500w的数据量全部读出来会增加内存占用率。
解决方案三:
select需要的字段添加索引
解决方案四:
可以只显示前n行,全部查出来也没用吧
解决方案五:
设置SqlDataAdapter变量的SelectCommand.CommandTimeout=0;意思是不限制查询命令执行时间。默认查询命令时有超时限制的
解决方案六:
最好还是分页;提高查询效率
解决方案七:
这种需要分页代码了。不适合采用系统自带的datagrid的分页功能一是内存占用大,二是网络负载也大,三是CPU也受不了,四是数据库的IO也难受
解决方案八:
建议在数据库那边做存储过程分页:createprocPageNum@PageSizeint,--每页显示条数@PageIndexint,--当前是第几页@totalRowsintoutput,--总行数@totalPagesintoutput--总页数asdeclare@startIdintdeclare@endIdintset@startId=@PageSize*(@PageIndex-1)+1set@endId=@startId+@PageSize-1select@totalRows=COUNT(*)fromBooksset@totalPages=@totalRows/@PageSizeif(@totalRows%@PageSize!=0)--如果总行数除每页显示数据量的值不等于0,则总页数得加1beginset@totalPages=@totalPages+1enddeclare@IndexTabletable(Idintidentity(1,1),nIdint)insertinto@IndexTableselectIdfromBooksselect*from@IndexTableast,Booksasbwheret.Id>=@startIdandt.Id<=@endIdandt.nId=b.Idgodeclare@trint--总行数declare@tpint--总页数execPageNum4,2,@troutput,@tpoutputprint'这是总页数'+convert(varchar,@tp)--数据转换print@tr
解决方案九:
500W条数据,有19列----------------用户要求全部显示?
解决方案十:
分步加载数据
解决方案十一:
全部显示?内存还不爆掉。