ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:32.85KB ,
资源ID:24513148      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24513148.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(海量数据库的 查询优化及分页算法方案.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

海量数据库的 查询优化及分页算法方案.docx

1、海量数据库的 查询优化及分页算法方案海量数据库的 查询优化及分页算法方案.txt两个男人追一个女人 用情浅的会先放弃。两个女人追一个男人 用情深的会先放弃。你的话,我连标点符号都不信男女授受不亲,中国哪来13亿人口。随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。与此同时,应用系统体系的核心、系统数据的存放地数据库也随着实际应用而急剧膨胀,一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量。那么,如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解

2、决的难题。在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构:CREATE TABLE dbo.TGongwen ( -TGongwen是红头文件表名Gid int IDENTITY (1, 1) NOT NULL ,-本表的id号,也是主键title varchar (80) COLLATE Chinese_PRC_CI_AS NULL ,-红头文件的标题fariqi datetime NULL ,-发布日期neibuYonghu varc

3、har (70) COLLATE Chinese_PRC_CI_AS NULL ,-发布用户reader varchar (900) COLLATE Chinese_PRC_CI_AS NULL ,-需要浏览的用户。每个用户中间用分隔符“,”分开) ON PRIMARY TEXTIMAGE_ON PRIMARYGO下面,我们来往数据库中添加1000万条数据:declare i intset i=1while i=250000begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values(2004-2-5,通信科,通信科,办公室

4、,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科,这是最先的25万条记录)set i=i+1endGOdeclare i intset i=1while i=250000begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values(2004-9-16,办公室,办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科,这是中间的25万条记录)set i=i+1endGOdeclare h intset h=1while

5、h=100begindeclare i intset i=2002while i=2003begindeclare j intset j=0while j50begindeclare k intset k=0while k50begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(i as varchar(4)+-8-15 3:+cast(j as varchar(2)+:+cast(j as varchar(2),通信科,办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经

6、侦支队,户政科,外事科,这是最后的50万条记录)set k=k+1endset j=j+1endset i=i+1endset h=h+1endGOdeclare i intset i=1while i dateadd(day,-90,getdate()用时:53763毫秒(54秒)(3)将聚合索引建立在日期列(fariqi)上:select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi dateadd(day,-90,getdate()用时:2423毫秒(2秒)虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特

7、别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。得出以上速度的方法是:在各个select语句前加:declare d datetimeset d=getdate()并在select语句后加:select 语句执行花费时间(毫秒)=datediff(ms,d,getdate()2、只要建立索引就能显著提高查询速度事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段

8、上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度上面已经谈到:在进行数据查询时都离不开字段的是“日期”

9、还有用户本身的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi2004-5-5查询速度:2513毫秒(2)select

10、 gid,fariqi,neibuyonghu,title from Tgongwen where fariqi2004-5-5 and neibuyonghu=办公室查询速度:2516毫秒(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=办公室查询速度:60280毫秒从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个

11、索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。(四)其他书上没有的索引使用经验总结1、用聚合索引比用不是聚合索引的主键速度快下面是实例语句:(都是提取25万条数据)select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=2004-9-16使用时间:3326毫秒select gid,fariqi,neibu

12、yonghu,reader,title from Tgongwen where gid2004-1-1用时:6343毫秒(提取100万条)select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi2004-6-6用时:3170毫秒(提取50万条)select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=2004-9-16用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)select gid,f

13、ariqi,neibuyonghu,reader,title from Tgongwen where fariqi2004-1-1 and fariqi2004-1-1 order by fariqi用时:6390毫秒select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi 10000和执行:select * from table1 where tID 10000 and name=zhangsan一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚

14、合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name=zhangsan的,而后再根据限制条件条件tID10000来提出查询结果。事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否

15、有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:列名 操作符 或 操作符列名列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:Name=张三价格500050005000如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。介绍完SARG后,我

16、们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:1、Like语句是否属于SARG取决于所使用的通配符的类型如:name like 张% ,这就属于SARG而:name like %张 ,就不属于SARG。原因是通配符%在字符串的开通使得索引无法使用。2、or 会引起全表扫描Name=张三 and 价格5000 符号SARG,而:Name=张三 or 价格5000 则不符合SARG。使用or会引起全表扫描。3、非操作符、函数引起的不满足SARG形式的语句不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、!、NOT EXISTS、NOT IN、NO

17、T LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:ABS(价格)5000SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:WHERE 价格2500/2但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。4、IN 的作用相当与OR语句:Select * from table1 where tid in (2,3)和Select * from table1 where tid=2 or tid=3是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。5、尽量少用NOT6、exists 和 in 的执行效率

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1