几种优化的方法:(from   泰山)    
  一、表的设计    
  当在表中添加字段的时候,应该选择长度最小的数据类型,这样表在内存中每页可以存储更多的记    
  录。如:“姓名”字段一般设置为TEXT类型,长度为10一般就够用,则比默认的255要好的多。整    
  型Integer的长度是2,在使用整型Integer就可以解决问题的地方不要使用Single、Long、    
  Double、Currency,因为它们的长度分别为4、4、8、8,都比2大。在建立表后一定要建立    
  索引,这可以大大提高查询速度,是提高速度最基本的要求。    
  二、压缩数据库    
  JET数据库的查询优化是有代价的,随着数据库的不断扩大,优化将不再起作用。压缩数据库会改    
  变数据库的状态,并重新优化所有查询。同时,随着数据库的增大,会产生很多碎片。而压缩数据    
  库可以把一个表中的数据数据写到硬盘中连续的页里,提高了顺序搜索的速度。    
  压缩数据库使用CompactDatabase命令,下面的语句压缩数据库并产生一个数据库备份:    
  DBEngine.CompactDatabase   “C:\VB\BIBLIO.MDB”,   “C:\VB\BIBLIO2.MDB”    
        Kill   “C:\VB\BIBLIO.BAK”       Name   “C:\VB\BIBLIO.MDB”   As   “C:\VB\BIBLIO.BAK”    
        Name   “C:\VB\BIBLIO2.MDB”   As   “C:\VB\BIBLIO.MDB”    
  注意,如果数据库很大的话,可能需要整夜的时间来压缩数据库。    
  三、避免查询输出里面多余的计算    
  当查询的结果作为另外一个查询的数据源的时候,可能引起查询优化问题。在这个时候第一次查询    
  里面尽量避免大量的计算。在如下示例中,Query1是第一个查询的结果,然后它作为第二个查询    
  的数据源。    
  Dim   DB   As   Database    
  Dim   RS   As   RecordSet    
        Set   DB   =   DBEngine.Workspaces(0).Opendatabase(“Biblio.MDB”)    
        DB.CreateQueryDef(“Query1”,   _    
              “SELECT   IIF(Au_ID=1,’Hello’,’Goodbye’)   AS   X   FROM   Authors”)    
        Set   RS   =   DB.OpenRecordSet(“SELECT   *   FROM   Query1   WHERE   X=’Hello’”)    
  由于在第一个查询Query1中的IIF()表达式不能被优化,,所以在第二个查询中的WHERE子句也不    
  能被优化。如果一个表达式在一个查询树中埋藏的很深的话,则这个查询不可被使用,它是不可优    
  化的。    
  如果可能的话,把这个SQL语句合并为一个没有嵌套的SQL语句:    
  Set   RS   =   DB.OpenRecordSet(“SELECT   *   FROM   Authors   WHERE   Au_ID=1”)    
  对于更灵活的嵌套查询,尽量在SQL语句中使用字段名,如:    
  DB.CreateQueryDef(“Query1”,   _    
              “SELECT   IIF(Au_ID=1,’Hello’,’Goodbye’)   AS   X,   Au_ID,   FROM   Authors”)    
        Set   RS   =   DB.OpenRecordSet(“SELECT   *   FROM   Query1   WHERE   Au_ID=1”)    
  如果在查询输出中实在无法避免计算式的话,尽量把计算式放在最外层,不要放在最内层。    
  四、只输出需要的字段    
  在建立查询的时候,仅返回需要的字段,这样可以节省不必要的开支。如果某个字段不是你需要    
  的,不要在查询语句中出现。上面的事例正说明了这个问题。    
  五、分组、合并及汇总    
  这里要说明的主要是合并,当你需要把两个表合并,就是说:当你要根据“Customer   Name”对两    
  个表进行合并,要肯定GROUP   BY   field   (Customer   Name)和汇总(Sum,   Count,   and   等)的字段    
  是来自同一张表。    
  例如:下列语句优化性较差,因为SUM子句来自Ord表,而GROUP   BY子句来自Cust表:    
  SELECT   Cust.CustID,    
                      FIRST(Cust.CustName)   AS   CustName,    
                      SUM(Ord.Price)   AS   Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
        GROUP   BY   Cust.CustID    
  如果按照Ord.CustID分组,查询性能就好的多了:    
  SELECT   Ord.CustID,    
                      FIRST(Cust.CustName)   AS   CustName,    
                      SUM(Ord.Price)   AS   Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
        GROUP   BY   Ord.CustID    
  六、尽量减少分组的字段    
  SQL语句中分组(GROUP   BY)的字段越多,执行查询的时间越长。在GROUP   BY子句中尽量用    
  aggregate函数来减少字段的数量。    
  如:    
  GROUP   BY   As   Few   Fields   As   Possible    
        SELECT   Cust.CustID,    
                      Cust.CustName,    
                      Cust.Phone,    
                      SUM(Ord.Price)   AS   Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
        GROUP   BY   Cust.CustID,   Cust.CustName,   Cust.Phone    
  可以改为::      
        SELECT   Ord.CustID,    
                      FIRST(Cust.CustName)   AS   CustName,    
                      FIRST(Cust.Phone)   AS   Phone,    
                      SUM(Ord.Price)   AS   Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
        GROUP   BY   Ord.CustID    
  七、在合并之前嵌套GROUP   BY子句    
  如果要合并两张表,而且只在一张表中分组,把查询分为两个SELECT语句要快的多。    
  如:      
        SELECT   Ord.CustID,    
                      FIRST(Cust.CustName)   AS   CustName,    
                      FIRST(Cust.Phone)   AS   Phone,    
                      SUM(Ord.Price)   AS   Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
        GROUP   BY   Ord.CustID    
  可改为:      
  查询1:    
        SELECT   CustID,   SUM(Price)   AS   Total    
        FROM   Ord    
        GROUP   BY   CustID    
  查询2:    
        SELECT   Query1.CustID,   Cust.CustName,   Cust.Phone,   Query1.Total    
        FROM   Cust   INNER   JOIN   Ord   ON   Cust.CustID   =   Ord.CustID    
  八、在合并的时候两边的字段都设置索引    
  在合并表的时候,尽量使两边的字段都设置索引。这在执行查询的时候查询优化器可以更多的使用    
  sophisticated   内部合并策略。    
  当然,在关系型数据库中,表要设计的尽量小,(最好1-2K页),这样删除表的索引的时候要快    
  的多,这是因为内存中读入了很少的页。这需要根据实际情况多次测试。    
  九、添加索引来提高查询和排序的速度    
  为合并或查询条件中的所有使用字段建立索引。Microsoft   Jet   2.0极其以后版本的数据库引擎    
  使用使用了Rushmore查询优化技术,因此支持一张表的复合索引。    
  要尽量避免在查询条件中进行计算或在查询条件中使用未索引的字段。排序更是如此,绝对要避免    
  计算或使用未索引的字段。    
  十、使用可优化的表达式    
  重新构造查询语句,以便于Rushmore技术可以对其进行优化。Rushmore是一种数据访问技术,使    
  用它可以提高记录集的查询速度。使用Rushmore的时候,若在查询条件中使用具体类型的表达    
  式,查询速度将非常快。Rushmore不会自动为你的查询提高速度,你必须按照具体的方法修改查    
  询语句,以便于Rushmore可以优化它们。    
  十一、用COUNT(*)代替   COUNT([Column   Name])    
  Microsoft   Jet数据库引擎有特别的优化方法,它在使用COUNT(*)要比用COUNT([Column   Name])    
  快得多。    
  注意,这两个运算符是有差别的:    
  Count(*)   计算所有的行。      
  Count([Column   Name])计算所有Column   Name非空的行。    
  十二、在变量中避免使用LIKE    
  由于在查询完成的时候变量的值不确定,所以无法使用索引,这样,建立的索引就失去了意义,这    
  就严重制约着查询速度。    
  十三、避免LIKE和统配符同时使用    
  如果要把LIKE运算符同统配符一起使用,为了使用索引,必须把统配符放在后面。    
  如,下列语句利用了索引。    
        Like   "Smith"    
        Like   "Sm*"    
  而下列语句根本没有使用索引:      
        Like   "*sen"    
        Like   "*sen*"    
  十四、测试合并约束    
  如果要在合并中使用表达式约束一个字段的数值,需要测试表达式放在合并的一侧,还是其他地    
  方,看哪种查询的速度较快。在一些查询中,表达式放在合并关键词join一侧反而比较快。    
  十五、使用中间结果表    
  用SELECT   INTO建立工作表,尤其是结果集用于几个查询的时候,尽量使用中间结果表。在查询前    
  做的准备工作越多,查询速度越快。    
  十六、避免子SELECT语句和NOT   IN同时使用    
  子SELECT语句和NOT   IN同时使用很难优化,取反嵌套的查询或OUTER   JOINs影响很大。    
  下列事例查询不在orders表中的用户:    
  优化前:    
              SELECT   Customers.*    
              FROM   Customers    
              WHERE   Customers.[Customer   ID]    
                          NOT   IN   (SELECT   [Customer   ID]   FROM   Orders);    
  优化后:      
              SELECT   Customers.*    
              FROM   Customers   LEFT   JOIN   Orders    
                        ON   Customers.[Customer   ID]   =   Orders.[Customer   ID]    
              WHERE   ((Orders.[Customer   ID]   Is   Null));

转载于:https://www.cnblogs.com/zhaohui0312/archive/2007/06/27/797935.html

数据访问优化性能(转载)相关推荐

  1. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能...

    下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...

  2. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能

    "啊!你在用ORM?会不会性能很差啊?" 用数字来说话,打破模糊的.传言的印象. 标题提到的组件"增删改查"都实现了测试代码,所以除了测试外,也可以把此项目作为 ...

  3. 【深度学习】基于 Alluxio 数据缓存的性能优化

    作者 | 车漾(阿里云高级技术专家).顾荣(南京大学 副研究员) 导读:Alluxio 项目诞生于 UC Berkeley AMP 实验室,自开源以来经过 7 年的不断开发迭代,支撑大数据处理场景的数 ...

  4. es分页查询重复数据_ES优化 - 巨量数据如何提高查询性能

    问题:如果数据量特别大,如何优化ES的查询性能? 可以从以下几个方面进行思考: File Cache可用的内存: ES的查询严重依赖OS的File Cache,所以说内存分配的内存肯定是越多越好.最理 ...

  5. 高性能Javascript:高效的数据访问

    2019独角兽企业重金招聘Python工程师标准>>> 经典计算机科学的一个问题是,数据应当存放在什么地方,以实现最佳的读写效率.数据存储是否得当,关系到代码运行期间数据被检索到的速 ...

  6. petshop4.0 详解之三(PetShop数据访问层之消息处理) [转]

    三.PetShop数据访问层之消息处理 在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量.数据流量.服务器 ...

  7. petshop4.0 详解之三(PetShop数据访问层之消息处理)

    在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量.数据流量.服务器负荷的问题.解决性能的瓶颈,除了对硬件系 ...

  8. [wayfarer]PetShop数据访问层之消息处理

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/09/06/496207.html <解剖PetShop>系列之三 三.PetShop ...

  9. 打造自己的数据访问层(二)

    上一篇打造自己的数据访问层(一)中,我们已了解了.NET对数据库操作的基本原理,并就Ado.net对象的使用提出了几点疑问: 1.如何由系统来判断数据库型. 2.如何消除这些重复代码. 而上篇中也提出 ...

  10. 打造自己的数据访问层(三)

    上一篇打造自己的数据访问层(二)中,我们已具体实现了数据访问层对应的功能,该进行收尾工作了,先来看段代码,试试上一篇实现的功能: View Code string sqlText = "SE ...

最新文章

  1. redis与spring的完全集成
  2. Python 技术篇-在cmd命令提示行里模拟动态下载进度条实例演示,cmd清除日志、打印动态内容方法
  3. Homework 1_SQL Server中由于外键约束而删除数据失败
  4. 排序算法(1)----选择排序算法
  5. 直接访问WEB-INF目录下的JSP页面的方法
  6. linux脚本 let,通过shell 脚本查看服务器的时时流量
  7. 观察者模式Java内存管理进阶篇——如何避免内存泄漏
  8. 高清数字电视视频处理器画质增强技术简介
  9. 16、单片机串口原理与应用
  10. 摄影网站主页源码html,2017年最新15个漂亮的 HTML 摄影网站模板
  11. 计算机配件有没先后顺序,内存插槽是否有优先顺序?
  12. COCO数据集转VOC之检测
  13. 现实迷途 第二章 借酒买醉
  14. 技术管理条线度量报告
  15. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
  16. LPDDR5 JEDEC
  17. postgresql服务启动不了
  18. 中级宏观经济学-笔记
  19. U盘被识别但不显示盘符怎么样才能解决?
  20. 元宇宙与我们有哪些联系

热门文章

  1. Spark序列化入门
  2. 【Linux】scp IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  3. 浏览器对象模型bom的作用是什么?
  4. 小程序开发之旅(持续更新中..)
  5. ios学习路线_OC基础语法
  6. UVA 1394 And Then There Was One 约瑟夫环数学方法
  7. android文件操作和SDCard卡操作
  8. 移动平台开发项目(推箱子小游戏)
  9. 在sae中运行web.py应用
  10. (2) GoJS Node简介