热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SqlDataAdapter.Fill()比高效的存储过程效率还高,郁闷中??(请高手指点)

方法1:SqlDataAdapter的分页stringtemp_sqlstrselect*fromtestDataServer;SqlDataAda
方法1: SqlDataAdapter的分页
string    temp_sqlstr = "select * from testDataServer";
         SqlDataAdapter adapter = new SqlDataAdapter(temp_sqlstr, pubFunction.P_strConn);

        DataSet ds1 = new DataSet();

        long datestart = DateTime.Now.Ticks;

        Response.Write("datestart  " + datestart.ToString() + "
");

        adapter.Fill(ds1, 9990, 10, "0");


        long dateEnd = DateTime.Now.Ticks;
        long dIn = dateEnd - datestart;
        Response.Write("dateEnd  " + dateEnd.ToString());
        Response.Write("
" + dIn.ToString() + "
");
        Response.Write("打印数据:");
       
        for (int j = 0; j < ds1.Tables[0].Rows.Count; j++)
        {
            Response.Write("
" + ds1.Tables[0].Rows[j][0].ToString());
        }
  方法2: 网上比较号称比较高效的分页过程
存储过程:
CREATE  PROCEDURE litao_GetRecordByPage
    @tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 主键/排序 字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(6100)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型
--print @strWhere
if @OrderType != 0
begin
    set @strTmp = '<(select min'
    set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
    set @strTmp = '>(select max'
    set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
    + @strOrder

if @strWhere != ''
    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
    set @strTmp =''
    if @strWhere != ''
        set @strTmp = ' where ' + @strWhere

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
        + @tblName + ']' + @strTmp + ' ' + @strOrder
end
print @strWhere
if @IsReCount != 0
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere
print @strSQL
exec (@strSQL)

程序:

   string sql = "exec litao_GetRecordByPage @tblName='testDataServer' , @fldName='testid' , @PageSize=10,@PageIndex=999, @IsReCount=0,@OrderType=0,@strWhere='1=1'";
    long datestart = DateTime.Now.Ticks;
    Response.Write("datestart  " + datestart.ToString() + "
");
    DataSet ds1 = SuTao.CommonTools.DbHelperSQL.Query(sql);

    long dateEnd = DateTime.Now.Ticks;
    long dIn = dateEnd - datestart;

    Response.Write("dateEnd   " + dateEnd.ToString());
    Response.Write("
" + dIn.ToString() + "
");
    Response.Write("打印数据:");

    for (int j = 0; j < ds1.Tables[0].Rows.Count; j++)
    {
        Response.Write("
" + ds1.Tables[0].Rows[j][0].ToString());
    }

以我的100万条数据为例。
SqlDataAdapter.Fill()为1秒,而后者'号称高效的过程'用了7秒之多阿?
不知道是为什么??

14 个解决方案

#1


ding

#2


注意啊:
  adapter.Fill(ds1, 9990, 10, "0");
-------
这句代码实现的不是真正的分页查询,而是将数据一次性取出后再分的页,不是按分页的数据取出了刚好多的记录.

#3


这算那门子高效存储过程.只能说是通用,但绝不高效.
这个过程因为要通用,所以很多地方画蛇添足.

#4



#5


存储过程分页 肯定会高于
dataset完全读取分页的

这个 可能是你代码问题

也可能是因为你的测试数据虽然有100w条 但是简单
在内存中填充的时间短 而且你又有足够的内存 内存中操作当然是快.
还有就是你的
SuTao.CommonTools.DbHelperSQL.Query这个方法有问题..
建议你直接使用
SqlDataReader 直接获取数据 这样的测试才是准确的

#6


一个是动态sql.还要处理分页,另一个是直接一个表查询.

#7


先把你的存储过程执行一下,看用了多长的时间?这个存储过程很通用,但不一定高效

#8


select top         10 * from [testDataServer] where [testid]>(select max([testid]) from (select top       9980 [testid] from [testDataServer] where 1=1  order by [testid] asc) as tblTmp) and 1=1  order by [testid] asc
我打印sql后发现  
 order by [testid] asc 使我的过程非常慢,请高手指点是不是这里有问题

#9


排序是很消耗资源的

#10


hbxtlhx(平民百姓)  
你说的有道理,但是为什么我直接取所有的数据集,再去dataset10条,要比储存过程取10条填充,还要快得多

#11


因为用存储过程取的时候程序要直接从数据库取数据,
而用DataSet的话,它实际上已从数据库取出数据了,相当于本地操作了,所以会快,但它是建立在第一次很慢的基础上的.

#12


数据库 中 testid
设置成 索引

#13


dataset需要占用大量服务器内存.
还要从数据库服务器取大量数据到webserver
而存储过程只返回pagesize 条记录给webserver,再说这个存储过程也不怎么好.

#14


问题已经搞定,因为数据库重新用sql生成,所以把主键丢了,这个过程没有问题,程序也没有问题,谢谢大家

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
萌星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有