12、高效的TOP

  事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如:

  select top 10 * from (

  select top 10000 gid,fariqi,title from tgongwen

  where neibuyonghu='办公室'order by gid desc) as a

  order by gid asc

  这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是10000条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用,发现TOP确实很好用,效率也很高。但这个词在另外一个大型数据库ORACLE中却没有,这不能说不是一个遗憾,虽然在ORACLE中可以用其他方法(如:rownumber)来解决。在以后的关于“实现千万级数据的分页显示存储过程”的讨论中,我们就将用到TOP这个关键词。

  到此为止,我们上面讨论了如何实现从大容量的数据库中快速地查询出您所需要的数据方法。当然,我们介绍的这些方法都是“软”方法,在实践中,我们还要考虑各种“硬”因素,如:网络性能、服务器的性能、操作系统的性能,甚至网卡、交换机等。

  三、实现小数据量和海量数据的通用分页显示存储过程

  建立一个web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。

  更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

  最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。

  后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:  

CREATE procedure pagination1

  (@pagesize int, --页面大小,如每页存储20条记录

  @pageindex int --当前页码

  )

  as

  set nocount on //不返回计数,不返回任何结果集

  begin

  declare @indextable table(id int identity(1,1),nid int) --定义表变量

  declare @PageLowerBound int --定义此页的底码

  declare @PageUpperBound int --定义此页的顶码

  set @PageLowerBound=(@pageindex-1)*@pagesize

  set @PageUpperBound=@PageLowerBound+@pagesize

  set rowcount @PageUpperBound

  insert into @indextable(nid) select gid from TGongwen where fariqi > dateadd(day,-365,getdate()) order by fariqi desc

  select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O, @indextable t where O.gid=t.nid

  and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

  end

  set nocount off //返回计数,返回任何结果集

  以上存储过程运用了SQL SERVER的最新技术――表变量。应该说这个存储过程也是一个非常优秀的分页存储过程。当然,在这个过程中,您也可以把其中的表变量写成临时表:CREATE TABLE #Temp。但很明显,在SQL SERVER中,用临时表是没有用表变量快的。所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。但后来,我又发现了比此方法更好的方法。

文章出处:http://blog.csdn.net/cuizm/article/details/4498988

转载于:https://www.cnblogs.com/zrj531/archive/2012/02/22/2362755.html

sql server 海量数据速度提升:SQL优化-索引(11) 【转】相关推荐

  1. sql server 海量数据速度提升:SQL优化-索引(7) 【转】

    介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验: 1.Like语句是否属于SARG取决于所使用的通配符的类型 如:name like '张%' ,这就属于SA ...

  2. sql server 海量数据速度提升:SQL优化-索引(9) 【转】

    8.union并不绝对比or的执行效率高 我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or.事实证明,这种说法对于大部分都是适用的. ...

  3. SQL server 系统优化--通过执行计划优化索引(1) (转)

    SQL server 系统优化--通过执行计划优化索引(1) 前几天,远离上海,到了温州,在客户的这边处理系统慢,该系统每天正常down机7次左右,在线人员一多,系统运行缓慢,严重影响业务操作,到了无 ...

  4. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )...

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  5. 将一个基于磁盘的表迁移到SQL Server中的一个内存优化的表

    本文是微软的译文,对应的原文是:https://www.red-gate.com/simple-talk/sql/database-administration/migrating-disk-base ...

  6. SQL Server 性能调优3 之索引(Index)的维护

    SQL Server 性能调优3 之索引(Index)的维护 热度1 评论 16 作者:溪溪水草 SQL Server 性能调优3 之索引(Index)的维护 前言 前一篇的文章介绍了通过建立索引来提 ...

  7. php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...

    SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...

  8. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  9. SQL Server 2014如何提升非在线的在线操作

    SQL Server 2014如何提升非在线的在线操作 原文:SQL Server 2014如何提升非在线的在线操作 在今天的文章里,我想谈下在线索引重建操作( Online Index Rebuil ...

最新文章

  1. 猪和python(pig and python)
  2. thinkpad触控笔怎么用_电容笔怎么用,如何选择一支电容笔来提升生产力呢?
  3. 网站设计常用技巧收集
  4. 【译】x86程序员手册37-第10章 初始化
  5. 吐血整理:C#顺序、选择、循环结构用法与案例,这一篇就够了!
  6. React Native之Props(属性)和State(状态)和简单样式简单使用
  7. java map key 大写转小写_Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)...
  8. 使用Xftp5连接云服务器
  9. 基于Consul的数据库高可用架构【转】
  10. tyvj 1068 STR
  11. splunk VS elasticsearch
  12. Vue登录页面源代码分享
  13. 网络编程基础(Socket ServerSocket)
  14. 宏电4g路由器流量卡怎么设置_宏电4g无线路由器设置_4g路由器怎么设置网口
  15. 关于nginx配置负载均衡,nginx.conf配置文件正确,一直跳出nginx欢迎界面
  16. 【硬件】【RF 连接器】
  17. 五、结构化分析与设计
  18. 打开21端口 linux,Linux开启FTP的21端口
  19. 激光雷达核心技术及行业格局梳理
  20. 20分钟掌握前端编写 CLI 工具

热门文章

  1. Git Fetch vs Pull:Git Fetch和Git Pull命令之间有什么区别?
  2. 初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情
  3. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
  4. java程序员入门先学什么开发者工具
  5. 【冷门实用小工具】轻量级流程图工具ClickCharts PRO绿色版,ClickCharts PRO下载【亲测有效】
  6. Android屏幕适配框架-(今日头条终极适配方案)
  7. 【教你赚钱】独立开发者荒野求生之道
  8. linux svn使用方法
  9. 我都陪你坐了一天了,你好歹说句话啊!吖的,谱也忒大了。。。
  10. Loonframwork到SWT的移植测试(JAVA GAME TEST SOURCE)