2004年数据库查询优化实例

情况:sqlserver 2000,资源表,记录近30万条。资源有一个整数的id字段,自动增量,但是资源可以被删除。所以,id并不连续。

用.net SqlDataAdapter进行分页查询,由于Fill()方法的机制问题,使得在DataGrid里面进行翻页的时候延时非常大。数据库

服务器和web服务器同在局域网,延时大约有3-4秒。经过分析,对此进行优化。

首先得知数据库的select count(id) from resource where id>n这样的查询速度非常快。所以利用这一点进行优化,以达到准确翻页

假设,记录的id是连续的,那么如果每页10条,那么我们要得到第12页,就需要第十一页最后一个记录的id。11 x 10 = 110,这个记录id就是110。所以第12页这么得到,select top 10 * from resource where id>110,这条语句的查询效率是非常高的。

但是如果id不连续,怎么办呢?

这里进行估算。因为cpu进行数值运算的耗时比起数据库查询可以忽略不计。假设,id是连续的,那么先统计一个数字。如果id连续,那么第m页需要的前一个记录id可以这么得到:(m – 1) * 10。所以先统计:

Select count(id) from resource where id<=(m-1)*10

假设统计得到的值为p,p<=(m-1)*10。如果p<(m-1)*10,那么我么可以这样查询:

Select top (((m-1)*10 – p) + 10) * from resource where id>(m-1)*10

查询完毕,取最后的10条记录就可以了。

这种方法对于实际的应用已经足够了。因为,一个几十万条记录的表一般是不经常删除操作的。如果有极端情况,那么可以连续估算2-3次,就可以比较准确了。

也就是(m-1)*10 – p很大的情况下,为了避免查询出太多的记录,进行二次估算。既然p太小了,再次假设id为(m-1)*10后的记录号是连续的。我们需要的id是(m-1)*10 + ((m-1)*10 – p) = 2*(m-1)*10 –p。

查询:

Select count(id) from resource where id<=2*(m-1)*10 –p

得到q,那么我们真正需要的查询是:

Select top (2*(m-1)*10 –p – q+ 10) * from resource where id>2*(m-1)*10 –p

取查询结果的最后10条记录。

这种优化可以用存储过程来实现,获得更好的效果。

经过这样的优化以后,查询速度从原来的超过3秒多变成了瞬间,不足1秒,当时尚未使用存储过程。

这是在asp.net 1.1的时候,利用DataGrid绑定数据的时候解决sqlserver 2000查询效率的一个实例。在此提供出来只是提供一个思路,方案也许有用,也许已经过时了。

转载于:https://www.cnblogs.com/worldreason/archive/2008/07/07/1237773.html

多年以前提高asp.net分页查询效率的一个实例相关推荐

  1. oracle数据分布不均,oracle性能优化操作七:索引提高数据分布不均匀时查询效率...

    索引的选择性低,但数据的分布差异很大时,仍然可以利用索引提高效率. A.数据分布不均匀的特殊情况下,选择性不高的索引也要创建. 表ServiceInfo中数据量很大,假设有一百万行,其中有一个字段Di ...

  2. node js+sql 后端分页查询效率越来越低解决方案

    创建分页的时候查询效率越来低的解决原因 1,没创建索引 CREATE INDEX index_name ON table_name(column_name,column_name) include(s ...

  3. (easyui datagrid+mvc+json)之asp.net分页查询

    最近在做分页查询的功能,在网上也翻看了不少,但是自己的吸收能力就差了好多,而且当时最大的想法就是,怎么就没有我想要的那种,既是easyui的,又要用mvc的架构,还要能够实现底层的分页传值,用.net ...

  4. 怎么提高mysql多表查询效率_MySQL创建index提高多表查询效率

    本文的目的在于探讨use index for join语句的基本原理.我们知道,在MySQL使用JION语句关联多表查询时,为表创建Index能够大幅度提高查询效率.下面以一个简单的例子来了解其中的原 ...

  5. asp.net分页查询

    分页查询 1.数据库 USE [master] GO /****** Object: Database [RbacDB] Script Date: 2020/6/2 23:51:00 ******/ ...

  6. mysql limit分页查询效率

    前提:id是主键 select * from `order` limit 1000000 , 30 当数据量大的时候改写成下面的 select * from `order` where id  > ...

  7. java中的分页 效率考虑_面试官:数据量很大,分页查询很慢,有什么优化方案?...

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  8. easyui datatable ajax 加载数据,ASP.NET easyUI--datagrid 通过ajax请求ASP.NET后台数据的分页查询...

    js前台对datagrid的定义代码,如下 mygrid = $('#mytable').datagrid({ fit: true, //自动大小 height: 'auto', rownumbers ...

  9. mysql嵌套查询效率低,连接查询代替嵌套查询提高select效率

    当数据库中含有大量数据时,而我们所需要的信息不再是仅仅局限于一个表中的数据信息,这时我们需要将对一个表进行信息查询转而变成对多个表进行信息搜索并进行组合. 解决这样的问题我们通常是运用嵌套查询的方法, ...

最新文章

  1. CAS SSO 原理 - 基础模式
  2. webpack+vue搭建基础
  3. swing程序中如何响应鼠标回车事件?
  4. js设置了location.href不跳转问题
  5. Linux 删除除某个文件之外的所有文件
  6. Http请求返回结果报UnsupportedCharsetException
  7. ImageLoader
  8. Flex里[Exclude]标签的作用:对外忽略/隐藏内部某对象
  9. Apache Tomcat漏洞总结
  10. 阿里巴巴上市路演ppt 官方完整版
  11. 视频教程-C/C++黑客编程入门教学视频-C/C++
  12. 迅雷x下载的东西都变成php格式化,关于文件下载后变成PHP格式的解决办法
  13. aspen稳态导出动态_Aspen Dynamic 针对精馏塔的模拟设计过程详解 | APP技术稿第1期...
  14. 指令集架构、微架构、处理器架构、CPU架构、内核
  15. keras网易日月光华笔记
  16. redirectType=Found和redirectType=Permanent哪个是301哪个是302?
  17. 杰理之测试主副麦的频响及幅度【篇】
  18. 计算多项式的值——基于C语言程序
  19. 《手把手教你学51单片机》之十三------1602液晶与串口的应用实例
  20. 毕业设计效果展示:改良的CP-VTON(ICP-VTON)模型

热门文章

  1. putty远程登录ssh主机
  2. 像聊天机器人一样的c语言程序,示例:聊天机器人
  3. 常用MYSQL日期查询
  4. PasswordEncoder详解
  5. DNS递归查询与迭代查询
  6. 常见端口、端口查询及TCP状态
  7. cs-Filters
  8. [转]编译器选项(摘自MSDN)及VC项目配置基础
  9. java生成图片url_Java Springboot如何基于图片生成下载链接
  10. Could not load driverClass ${jdbc.driver}