您好,欢迎访问一九零五行业门户网

Access分页及效率分析(MSSQL Server、Oracle分页)

在实际过运用过程中,我们开发的项目有时需要支持多种数据库,那么在开发中我们会遇到不同的数据库在sql语句方面还有区别,导致我们有些细节需要去调整,下面就分页功能在不同的数据库中的具体使用详细说明。 一、access数据库分页与效率分析 由于access操作
 在实际过运用过程中,我们开发的项目有时需要支持多种数据库,那么在开发中我们会遇到不同的数据库在sql语句方面还有区别,导致我们有些细节需要去调整,下面就分页功能在不同的数据库中的具体使用详细说明。 
一、access数据库分页与效率分析
        由于access操作简单,调用,迁移方便,节省费用,对于搭建者的能力要求也会低些,对于较小量的数据,我们使用access数据库是比较适合的,但是随着数据量增加,达到几十万、几百万甚至更多的时候,那么数据库的效率就会出现问题了,这个时候比如像分页功能可能就出现问题了,下面我们就看看常见的access分页有哪些方式?
        方案一:使用ado.net本身的结果集,使用pagesize,absolutepage的属性来进行分页
                        当然我一般不推荐使用拖控件进行快速开发,拖控件会导致产生大量的垃圾代码,是网站效率低下,当然在后台可以使用部分控件,今天就不说.net拖控件效率低下的问题了,使用ado.ne的结果集方式,每次都要读入符合条件的所有记录,然后再定位于对应页的记录。当数据量大的时候,效率就十分的低下。
        方案二:使用not in 方式
                       select top 3 * from article where id not in(select top 6 id from article)
                       使用not in 方式,其中的top效率很高,但是not in 呢? 测试发现,当数据量比较小时还是挺快的,但是当到达10万条数据是,单击查询就慢了,如果使用该分页方式,当数据量很大时,估计天天有人在骂:这是哪个sb开发的系统啊,这么垃圾!
       方案三:使用select top pagesize * from (select top pageindex*pagesize * from ywgl_news order by id desc) order by id
                       在实际过程中发现,当数据量比较大是,使用这种方式分页,access的效率还可以,比not in 方式效率高多了,但是此处也需要注意的是:很多人喜欢使用select * from 表名, 实际中发现这不是一个好习惯,我们应该需要什么字段查询什么字段,这样能够极大的节省服务器资源。
二、mssql server和oracle数据库的分页
        当然mssql server和oracle数据库的分页可以选择的方式更多,除了使用ado.net数据集、not in 方式、select top方式外,还有row_number方式等更好的分页实现方式,
                  select * from
                               (select * ,row_number() over(order by id) rownumber from t_users) as t
                  where t.rownumber>4 and t.rownumber        需要注意的是:在mssql server和oracle中使用row_number还有些细节不同,下面就是oracle和ms sqlserver中的具体分页方式:
                  int start = (pageindex - 1) * pagesize;
                  int end = pageindex * pagesize;
       oracle的分页t-sql语句:
                 string sql = select * from(select a.*,rownum row_num from(select * from ywgl_news t {0} order by t.id desc) a)b where b.row_num> + start.tostring() + and b.row_num        mssql server的分页t-sql语句:
                 string sql = select * from(select * ,row_number() over(order by id) rownumber from ywgl_news {0}) as t where t.rownumber>+start.tostring()+ and t.rownumber
三、附录存储过程的写法(mssql server为例)      
        --创建存储过程row_number方式
        alter proc getpageforrownumber
        (
               @pageindex int,--当前页
               @pagesize int,--页容量
               @rowcount int out,--总行数
               @pagecount int out --总页数
         )
         as
         begin
         declare @sql nvarchar(225)
         select @rowcount=count(id),@pagecount=ceiling((count(id)+0.0)/@pagesize) from t_users
         set @sql='select * from
                                        (select * ,row_number() over(order by id) rownumber from t_users) as t
                          where t.rownumber>'+str((@pageindex-1)*@pagesize)+' and t.rownumber          exec(@sql)
          end
         ---测试row_number 方式的存储过程
         declare @rc int,@pc int
         exec getpageforrownumber 3,2,@rc out,@pc out
         select @rc,@pc
四、开发中遇到的小问题
       1、报错标准表达式中数据类型不匹配。
             access在进行参数化查询的时候老是报错,这让哥很纳闷啊,看着sql语句也是对的,参数的值也是对的,为什么老是提示报错呢?如下图代码就会报该错误。
                          string sql = update ywgl_news set new_title=@new_title, new_source=@new_source ,new_readcount=@new_readcount,new_content=@new_content,new_summary=@new_summary,new_author=@new_author,new_classid=@new_classid where id=@id;
                        oledbparameter[] para = new oledbparameter[]
                        {
new oledbparameter(@id,model.new_id),
                                 new oledbparameter(@new_title,todbvalue(model.new_title)),
                                 new oledbparameter(@new_source,todbvalue(model.new_source)),
                                 new oledbparameter(@new_readcount,todbvalue(model.new_readcount)),
                                 new oledbparameter(@new_content,todbvalue(model.new_content)),
                                 new oledbparameter(@new_summary,todbvalue(model.new_summary)),
                                 new oledbparameter(@new_author, todbvalue(model.new_author)),
                                 new oledbparameter(@new_classid,todbvalue(model.new_class.id))  
                         };
                         num = accesshelper.executenonquery(sql, para);
         经过查找原因,原来问题出在”@“符号上了,我们可以用”?“占位符替换,这个mssql server有点小不同,如果使用了”@“那么就要确保各个参数的顺序一致。否则就报该错误。
         2、在删除操作时删除不了
               各个数据库具体t-sql语句还有些不同,在oracle中中 string sql = delete ywgl_news where id=:id;可以删除,没问题,但是在access中这样写就不行了应该这样写:
                string sql = delete from ywgl_news where id=@id;
五、总结三种不同数据库的分页方式及效率
        那么我们在实际应用中,到底该选择哪种类型的数据库呢?使用access,还是mssql server,还是oracle?不要觉得oracle就觉得你的系统很牛b,这个需要根据系统的定位和使用者来进行确定,如果说是一个很小的政府门户网站,数据量也很小,那么用一个access完全够了,而且数据量很小的时候,access的速度还更快,当然如果说是做gis的国土数据整合系统,那像这样的海量的数据,那就肯定需要用像oracle大型数据库了。
其它类似信息

推荐信息