`
ribishuangba
  • 浏览: 288338 次
文章分类
社区版块
存档分类
最新评论

千万数据的连续ID表,快速读取其中指定的某1000条数据?

 
阅读更多

有这样一个需求:一张上千万数据的表,结构很简单:ID是自增的,你怎么快速读取其中指定的某1000条数据,比如100万到100万零1000?

这个需求其实很简单,因为是自增型ID,可能分两种状况:有聚集索引或Heap,如果是后者,我想用ID和新增时间组建非聚集索引。效果应该相差不大。

于是动手,过程如下:

一、准备测试数据:

基本测试环境:
邀月工作室

插入1000万测试数据:


完成后,数据文件大小如下:

邀月工作室

二、创建一个存储过程用于测试:

邀月说明:其实,加不加top对查询并没有影响。后面的测试证实了这一点。

测试语句:

此时,由于SQL Server默认为主键PID创建了聚集索引,查询速度比较理想,平均为0-16毫秒之间,更接近于0

查询计划也如我所料:
邀月工作室

而如果以Pguid作为聚集索引键,查询计划如下:
邀月工作室

如果以AddTime作为聚集索引键,查询计划:
邀月工作室

三、修改聚集索引,以检查查询速度


测试结果有些令我意外:

1、在没有聚集索引的前提下,无论在GUID,AddTime,PID创建非聚集索引,查询的速度均相差甚远。平均在200毫秒以上,并且此时每次查询均在10秒以上。这与查询的计划缓存有关。

2、在创建聚集索引时,性能PID>AddTime>PGuid,但总体相差不明显。

四、检查索引存储内部

使用微软未公开的一个命令DBCC IND

结果约有21万个数据页:(211985 row(s) affected)

为了更方便找出根页(Root Page),我们使用一个表来存放DBCC IND的查询结果:

假定我们要找PID为100000的记录。附查找过程如下:

邀月工作室
http://nfnhgq.blu.livefilestore.com/y1p6LlHd2IySTDYOYmb31ic0ix6cKEh160UDrt_iS5eQRUDVbGpD7QOpgqHpHM9cdIsWKn08i5wU-8Y5cxvR_cKrLddPXBX1Z8r/2010-08-27%2017-35-41.png?psid=1

邀月工作室

邀月工作室

小结:

1、一个聚集索引的叶级正好就是数据自身,所以当一个聚集索引被创建时,表中数据被复制并依据聚集键排序,聚集索引被逻辑维护而不是物理维护。这样,查询时通过逻辑扫描可以很快找到某行所在的索引页,进而找出连续的1000条记录所在的页。

2、 对于一个非聚集索引来说,如果是Heap,行的标识就是它们的物理行标识(RID);如果是聚集表,则为聚集健,这个值称为书签值(bookmaark value),它和索引键、包含性列一起组成了非聚集索引的叶级。另外,在B树查找非叶级的页时,将可能不得不通过指向子页的指针进行物理定位,这可能会 增加查询的时间。还有,非聚集索引仅仅包含被索引定义的数据,对于没有在索引中定义的数据,可能需要在物理行进行一个书签查找(bookmark lookup)。

3、对于大数据量的查询,建立聚集索引是必须的。如果查询以ID序列为主,可以直接在标识列建立聚集索引。如果查询以时间段为主,则可以考虑用时间和标识列建聚集索引。

以上结论谨供参考,欢迎交流。

关于索引的物理存储与查询,请查看:《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)

邀月注:本文版权由邀月 和CSDN共同所 有,转载请注明出处。
助人等于自助! 3w@live.cn

   



分享到:
评论

相关推荐

    loadrunner连续长时间执行

    有朋友开始投诉了,说我已经好长...第三个参数(Movie 的 ID)存放在第二个文件中,有999条记录。然后在测试工具中设置参数取值的读取为顺序读取并且循环读取。通过这种简单的方法组合出了大量的数据。 问题被解决了。

    Excel VBA实用技巧大全 附书源码

    01077在工作表的任意位置快速显示快捷菜单 01078在单元格中输入公式 01079在单元格中输入数字 01080在单元格中输入文本 01081单元格区域引用 01082在单元格中输入数字和文本 01083为输入对话框设置默认值 01084在...

    Toad 使用快速入门

    模式浏览功能可以让我们快速访问数据字典,浏览数据库中的表、索引、存储过程。Toad 提供对数据库的快速访问,使用极为方便,用户界面简洁,结构安排合理。当我们点击一个单独的数据库对象,Toad立即显示此对象的...

    MAPGIS地质制图工具

    3、选择菜单剖面图-读取地形数据(现有3种方式,此选拉线读取),沿着勘探线从开始处拉线到末端出现设置基本数据对话框(如下图),这里要注意地形图比例尺和剖面图比例尺,默认是1:5000和1:2000。如果不是这个...

    2009达内SQL学习笔记

    在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后...

    H3BPM 试用系统操作手册

     通过业务服务(Data Table Adapter),写入、读取、更新第三方数据库(ERP)中的数据表:Vendor 和Material;  通过【数据模型】的【关联关系】,通过1:1或1:N的对应关系把多个【数据模型】关联起来,如:...

    MP3格式解析

    当你想读取MPEG文件的信息时,解析前三个字节,判断是否有ID3V2标签,有则根据上面的方法算出ID3V2标签的总大小,这样就找到了音频数据帧的第一帧,读取它的头信息,获取比特率、采样率、MPEG版本号、Layer描述号等...

    rar压缩软件.rar

    如果你希望从标准输入设备读取文件名,指定空的文件列表名(只有@)。 默认, 控制台 RAR 的列表文件中使用单字节编码。但是可以使用 -sc<字符集>l 开关重定义。 你可以在同一命令行指定普通文件名和列表文件。...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。...

    sysinternals 工具集合 (20090226版)

     一个基于命令行的小程序,能够快速有效的整理硬盘上的文件碎片,可以使文件变的连续,提高访问速度。Power Defragmenter是一个高手编写的Contig的GUI版本,带有一个图形界面,用起来更方便,更直观。可以大大提高...

    WinRAR_4.0.exe

    如果你希望从标准输入设备读取文件名,指定空的文件列表名(只有@)。 在列表文件中 Win32 控制台 RAR 使用 OEM (DOS) 编码。 你可以在同一命令行指定普通文件名和列表文件。如果文件和列表 文件都未被指定,那么...

    电子巡更系统设计方案.docx

    生成巡更情况总表、巡更事件表、巡更遗漏表。每月还可列出月统计报表,并可通过打印机将结果输出。 7)巡更数据备份、恢复功能。定期可将以前的数据备份到软盘或硬盘上。需要的时候可恢复到软件中。 电子巡更系统...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    读取指定的字节数:UART1_ReadBytes() 上层使用方法:循环检测UART1_RcvdSize()是否大于0,大于则进行读取等下一步处理,也可再定义高一级的应用层帧缓冲,以实现应用层的完整帧处理,或者增加一个对接收FIFO的...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    在这一版本中,SQL 执行引擎引入新的内部数据表示方式 --- `Chunk`,一个结构中保存一批数据而不仅是一行数据,同一列的数据在内存中连续存放,使得内存使用更紧凑,这样带来了几点好处:1. 显著减小了内存消耗; 2....

    入门学习Linux常用必会60个命令实例详解doc/txt

    immortality按:请用ctrl+f在本页中查找某一部分的内容或某一命令的用法。 -------------------------------------------------------------------------------- Linux必学的60个命令(1)-安装与登陆命令 login 1...

    海康视频卡动态库

    using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Data; using System.Drawing;...using System.Windows.Forms;...using System.Runtime.InteropServices;...

    基于C++开发的射击游戏

    其中,注释可以写入文件中,但不能与即将要读取的数据在同一行。 3. 代码例子: // 读取 CFG 文件中所有的敌机名称 // 读取完后m_sEnimyName中的字符串是每个section name的连接,两两之间用”\0”字符分开,如: //...

    Linux 101 hacks (2nd)

    技巧88:将数据文件的指定域读取到shell 脚本中 第十二章:监控系统和性能 技巧89:free 命令 技巧90:top 命令 技巧91:ps 命令 技巧92:df 命令 技巧93:kill 命令 技巧94:du 命令 技巧95:lsof 命令 技巧96:sar...

Global site tag (gtag.js) - Google Analytics