数据库实验心得范文.doc_第1页
数据库实验心得范文.doc_第2页
数据库实验心得范文.doc_第3页
数据库实验心得范文.doc_第4页
数据库实验心得范文.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库实验心得范文 我在sqlserver索引基础知识系列中,第一篇就讲了记录数据的基本格式那里主要讲解的是数据库的最小读存单元:数据页一个数据页是8k大小 对于数据库来说它不会每次有一个数据页变化后就存到硬盘而是变化达到一定数量级后才会作这个操作这时候数据库并不是以数据页来作为操作单元而是以64k的数据(8个数据页一个区)作为操作单元 区是管理空间的基本单位一个区是八个物理上连续的页(即64kb)这意味着sqlserver数据库中每mb有16个区 为了使空间分配更有效sqlserver不会将所有区分配给包含少量数据的表sqlserver有两种类型的区: 统一区由单个对象所有区中的所有8页只能由所属对象使用 混合区最多可由八个对象共享区中八页的每页可由不同的对象所有 通常从混合区向新表或索引分配页当表或索引增长到8页时将变成使用统一区进行后续分配如果对现有表创建索引并且该表包含的行足以在索引中生成8页则对该索引的所有分配都使用统一区进行 为何会这样呢 其实很简单: 读或写8kb的时间与读或写64kb的时间几乎相同 在8kb到64kb范围之内单个磁盘i/o传输操作所花的时间主要是磁盘取数臂和读/写磁头运动的时间 因此从数学上来讲当需要传输64kb以上的sql数据时 尽可能地执行64kb磁盘传输是有益的即分成数个64k的操作 因为64kb传输基本上与8kb传输一样快而每次传输的sqlserver数据是8kb传输的8倍 我们通过一个实例来看有and操作符时候的最常见的一种情况我们有下面一个表 createtabledbo.member(membernodbo.numericididentity(1,1)notnull,lastnamedbo.shortstringnotnull,firstnamedbo.shortstringnotnull,middleinitialdbo.letternull,streetdbo.shortstringnotnull,citydbo.shortstringnotnull,stateprovdbo.statecodenotnull,countrydbo.countrycodenotnull,mailcodedbo.mailcodenotnull,phonenodbo.phonenumbernull,photographimagenull,issuedtdatetimenotnulldefault(getdate(),exprdtdatetimenotnulldefault(dateadd(year,1,getdate(),regionnodbo.numericidnotnull,corpnodbo.numericidnull,prevbalancemoneynulldefault(0),currbalancemoneynulldefault(0),membercodedbo.statuscodenotnulldefault() 这个表具备下面的四个索引: 索引名细节索引的列 membercorporationlinknonclusteredlocatedonprimarycorpno memberidentclustered,unique,primarykeylocatedonprimarymemberno memberregionlinknonclusteredlocatedonprimaryregionno memberfirstnamenonclusteredlocatedonprimaryfirstname 当我们执行下面的sql查询时候 selectm.memberno,m.firstname,m.regionnofromdbo.memberasmwherem.firstnamelikek%andm.regionno6andm.memberno5000go sqlserver会根据索引方式优化成下面方式来执行 selecta.memberno,a.firstname,b.regionnofrom(selectm.memberno,m.firstnamefromdbo.memberasmwherem.firstnamelikek%andm.memberno6)b 这个查询可以直接使用memberregionlink非聚集索引而且这个非聚集索引覆盖了所有查询列实际执行时只需要逻辑读取10次 wherea.memberno=b.memberno 不信你可以看这两个sql的执行计划以及逻辑读信息都是一样的 其实上面的sql如果优化成下面的方式实际的逻辑读消耗也是一样的为何sqlserver不会优化成下面的方式是因为and操作符优化的另外一个原则 1/26的数据和1/6的数据找交集的速度要比1/52的数据和1/3的数据找交集速度要慢 selecta.memberno,a.firstname,b.regionnofrom(selectm.memberno,m.firstnamefromdbo.memberasmwherem.firstnamelikek%1/26数据)a, (selectm.memberno,m.regionnofromdbo.memberasmwherem.regionno6andm.memberno6andm.memberno6andm.memberno6andm.memberno6andm.memberno5000go 这里index计算符可以是01指定的一个或者多个索引名字对于01的意义如下: 如果存在聚集索引则index(0)强制执行聚集索引扫描index(1)强制执行聚集索引扫描或查找(使用性能最高的一种) 如果不存在聚集索引则index(0)强制执行表扫描index(1)被解释为错误 总结知识点: 简单来说我们可以这么理解:sqlserver对于每一条查询语句会根据实际索引情况(sysindexes系统表中存储这些信息)分析每种组合可能的成本然后选择它认为成本最小的一种作为它实际执行的计划 成本代价计算的一个主要组成部分是逻辑i/o的数量特别是对于单表的查询 and操作要满足所有条件这样经常会要求对几个数据集作交集数据集越小数据集的交集计算越节省成本 的项目中竟然出现了滥用聚集索引的问题看来没有培训最最基础的索引的意义代价使用场景是一个非常大的失误这篇博客就是从这个角度来罗列索引的基础知识 使用索引的意义 索引在数据库中的作用类似于目录在书籍中的作用用来提高查找信息的速度 使用索引查找数据无需对整表进行扫描可以快速找到所需数据 使用索引的代价 索引需要占用数据表以外的物理存储空间 创建索引和维护索引要花费一定的时间 当对表进行更新操作时索引需要被重建这样降低了数据的维护速度 创建索引的列 主键 外键或在表联接操作中经常用到的列 在经常查询的字段上最好建立索引 不创建索引的列 很少在查询中被引用 包含较少的惟一值 定义为text、ntext或者image数据类型的列 heaps是stagingdata的很好选择当它没有任何index时 excellentforhighperformancedataloading(parallelbulkloadandparallelindexcreationafterload) excellentasapartitiontoapartitionedvieworapartitionedtable 聚集索引提高性能的方法在前面几篇博客中分别提到过下面只是一个简单的大纲细节请参看前面几篇博客 何时创建聚集索引 clusteredindex会提高大多数table的性能尤其是当它满足以下条件时: 独特,狭窄,静止:最重要的条件 持续增长的最好是只向上增加例如: identity date,identity guid(onlywhenusingnewsequentialid()function) 聚集索引唯一性(独特型的问题)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论