`
xiebh
  • 浏览: 613903 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

SQL Server 中索引底层实现

阅读更多
页和盘区(Page and Extents)

    你的表(Tables)中数据实际上都存储在页(pages)里,除了BLOB类型的数据。如果某列的字段的类型为BLOB那么将有一个16字节的指针指向BLOB page。页是MS SQL Server中数据存储的最小单位。每页包含以行(row)为单位保存数据。一行只能存储在一个页中。每页可以容纳8KB的信息。因为这个原因,每行的最大值为8KB。一组相邻的8个页被称为一个盘区(Extent)

堆文件和分配映射索引(Heap and the Index Allocation Map(IAM))


    堆文件在sysindexs表中只有一行记录,并且其indid = 0. sysindexs.FIRSTIAM字段指向了IAM页链表中一个IAM页,IAM页是用来管理SQL Server已经给堆文件分配的空间。MS SQL Server2000用IAM(Index Allocation Map)页来在堆文件中导航(navigate)。在堆文件中,数据页(data page)和数据页中数据没有按照特定的顺序存储,也没有链接在一起。数据页之间唯一的逻辑链接是通过IAM页中记录来实现的。



索引结构(Index Structure)

   所有的SQL Server 索引都是 B-Trees。在这种树的顶端有一个根页(root page),通过root page来访问N个中级(intermediate level)页,直到树的底部、或叶级(leaf level)。可以通过树中每个节点的指针从上向下扫描整个索引树。另外,每个索引级(index leves)(可能是intermediate leve or leaf level)都有一个页链(page chain)。在一个索引中有许多intermediate level。索引树的级数(树的高度)与索引码的宽度、索引类型、记录行数和表中的页数有关,并且索引树的级数是影响索引性能的一个重要参数。


非聚集索引(Nonclustered Indexs)

    一个非聚集索引与一本书的索引相似。数据存储在一个地方,索引存储在另外一个地方,可以通过索引中的指针来访问存储的数据。索引中的条目是按照索引码的值按序存储,但是表中的信息可以按照不同的顺序存储(如可以按照聚集索引存储)。如果表中没有创建聚集索引,那么表中的记录就不能保证按照某种特定的顺序。



    与你用一本书的索引方式一样,SQL Server2000也是先通过非聚集索引检索到查找数据在表的位置,然后通过该位置来检索数据。这使得非聚集索引非常适合精确匹配查询(This makes nonclustered indexes the optimal choice for exact match queries),因为索引条目中包含了你需要查找数据的位置信息。如果当前的表是以聚集索引方式存储,那么非聚集索引的位置信息就是聚集索引的索引码(index key);否则,位置信息就是row ID(RID),每个RID由file number、page number和 slot number of row(每行记录的槽号)。比如,要在一个表中检索某个employee ID(emp_id),该表已经有在emp_id列上创建了非聚集索引,SQL Server查找索引树,找到一个索引条目包含你需要查找的emp_id,然后利用其中RID来访问到对应数据页中的值。


注意事项

    非聚集索引适用于以下场景:
    
  • 列中包含大量的不同值,如last name 和 first name 构成的复合索引(假如已用另外列创建的聚集索引) 。如果某列中只有很少的不同值,如0或者1,大多数查询不会利用该索引的,因为一个表扫描通常更有效率。
  • 不返回大量结果集的查询 Queries that not return large result sets
  • 经常被包含在一个查询条件语句(WHERE clause)的列,且该查询返回精确配备(return  exact matches)
  • 决策支持系统中经常需要表之间的关联(join)和聚集(group)。在被包含在join和grouping操作的列上建立非聚集索引,和在外键列上建立聚集索引。
  • 一个给定的查询包含了表中所有的列,这样可以减少对表或聚集索引的访问。(Covering all columns from one table in a given query. This eliminates accessing the table or clustered index altogether.)我的理解就是覆盖索引。


聚集索引(Clustered Indexs)

     一个聚集索引决定了一个表中数据的物理存储顺序。一个聚集索引与一个电话目录相似,电话目录是按照last name来存放。因为聚集索引决定一张表中数据的物理存放顺序,所以一张表只能有个聚集索引,一个聚集索引可以包含多个列(复合索引),就像电话目录一样按照last name 和 first name记录一样,聚集索引与Oracle中的IOT'S(Index-Organized Tables)相似。



    一个聚集索引对范围查询非常有效率efficient on columns that are often searched for ranges of values。当用聚集索引把第一个行检索出来之后,后续行一定能保证在物理上是相邻的。例如,应用的某个查询需要频繁执行一个范围查询,聚集索引可以快速定位到满足条件的第一个数据,然后再检索表中与之相邻的记录直到最后一条记录。这样可以调高这类查询的性能。另外,如果某列经常用来对表中的数据进行排序(sort),该情况下也可利用聚集索引来节省每次排序的时间。

    当索引值唯一时,需要查找一个指定行,此时聚集索引也是高效率的。例如,用最快的方式来找到一个指定empoyee ID的employee记录就是在emp_id列上创建一个聚集索引。



注意事项

    在创建聚集索引时,索引列应该尽量少,这一点很重要。如果定义一个大的索引码,那么该表中的任何非聚集索引就会显著的增大,因为每个非聚集索引叶级索引条目都包含了一个聚集索引码。

  聚集索引适用于以下场景:
  • 列中包含大量的不同值
  • 返回一个范围记录的查询,像BETWEEN, >, >=, <, and <=.的操作;
  • 顺序访问的列
  • 返回大量记录的查询
  • 在查询中某列被频繁的包含在join或group语句中,尤其该列也是该表的外键。在ORDER BY或 GROUP BY语句的列上建立聚集索引可以减少SQL Server对数据的排序,因为表中行已经是有序的了,这样可提高查询的性能。
  • 在OLTP类的应用中经常需要快速查找某行记录,尤其是一主键的来查找,此时可在主键上创建一个聚集索引。


   聚集索引不适合以下场景:
  • 频繁变化的列。这样造成了表中行经常移动,
  • 宽键(wide keys)聚集索引的索引码被所有的非聚集索引来用来检索,所被存储在每个非聚集索引的叶级索引条目中。

  
  • 描述: sqlServer heap structure
  • 大小: 5.9 KB
  • 大小: 8 KB
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    SQLServer 视图 事务 索引

    SQL Server中的视图、事务和索引是数据库管理中的核心概念,它们各自扮演着重要的角色,帮助用户更高效、安全地操作和查询数据。 视图,作为数据库的一种抽象,是基于一个或多个表的SELECT查询结果集的逻辑表示。在...

    SQL server Native Client 10.0

    这个组件在64位操作系统中尤其重要,因为它提供了对64位数据源的支持,确保了与SQL Server 2008 R2等64位数据库系统的高效通信。 1. **ODBC接口**: ODBC是SQL Server Native Client 10.0中的关键部分,它是一个...

    SQL Server Native Client 10.0 驱动

    2. **支持新特性**:包括对SQL Server 2008引入的新特性如FILESTREAM、透明数据加密(TDE)、Change Data Capture (CDC) 和列存储索引的支持。 3. **连接池**:通过ODBC和OLE DB接口实现连接池管理,提高资源利用率...

    Inside Microsoft SQL Server 2008 T-SQL Programming.pdf

    - **事务处理**:阐述了事务的基本概念及其在SQL Server中的实现方式,包括如何使用BEGIN TRANSACTION、COMMIT和ROLLBACK语句来确保数据的一致性和完整性。 #### 四、性能优化与最佳实践 为了帮助读者更好地利用...

    Win10可用的Microsoft SQL Server 2008 Native Client

    5. 支持SQL Server的XML数据类型:SQL Server 2008引入了对XML的原生支持,Native Client能够处理XML数据的输入和输出,包括XML索引和XML数据的查询。 6. 支持ADO.NET:尽管不是直接的组成部分,但Native Client与...

    SQL Server 2012 Native Client.rar

    开发人员可以利用SQL Server Native Client的API在C++、VB.NET、C#等编程语言中创建应用程序,实现高效、安全的数据库访问。同时,它也可以被数据库管理工具和ETL(提取、转换、加载)工具所使用。 6. **升级与...

    SQLSERVER 绿色版 6.5.2.1 源代码

    SQLSERVER 绿色版 6.5.2.1 源代码的发布,为开发者提供了一次深入了解和学习微软SQL Server数据库系统内部工作原理的机会。这个版本是基于D7编译的,意味着它可能使用的是Delphi 7编程语言进行开发,这是一种流行的...

    SQLServer2005.技术内幕四部曲中文PDF

    《SQLServer2005.技术内幕四部曲中文PDF》是一套全面解析SQL Server 2005核心技术的中文教程,包含了T-SQL查询、T-SQL程序设计、存储引擎以及查询、调整和优化四个重要方面。这套书籍旨在帮助IT专业人员深入理解SQL ...

    基于sql server 2005学习sql

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,而SQL Server 2005作为微软公司的一款强大的数据库管理系统,为开发者提供了广泛的功能和工具,使其在数据库管理和开发领域中占据重要地位...

    sql server 2008技术内幕 源代码

    T-SQL(Transact-SQL)是用于与SQL Server交互的主要编程语言,书中会详细讲解如何编写查询、更新、插入和删除语句,以及如何使用存储过程和触发器来实现更复杂的业务逻辑。T-SQL的优化技巧也是重要一环,包括索引的...

    VB+SQL Server 2000 实现学生教务管理系统源码

    在实现过程中,开发者通常会使用ADO (ActiveX Data Objects) 或 OLE DB 技术来建立VB与SQL Server 2000之间的数据连接。ADO是微软提供的一组接口,用于访问各种数据库,而OLE DB是更底层的数据库访问接口,支持多种...

    sql server 2000高级开发指南sql server 2000高级开发指南

    此外,随着XML在数据交换中的广泛应用,SQL Server 2000提供了对XML的内置支持,包括XML数据类型、XML索引和XML函数。 七、分析服务和数据仓库 SQL Server 2000的分析服务(OLAP和数据挖掘)为企业提供了强大的商业...

    SQL Server 2008 Native Client

    2. 支持新功能:SQL Server 2008引入了多项新特性,如列存储索引、透明数据加密(TDE)、Policy-Based Management等。SQL Server 2008 Native Client使得这些新功能在应用程序中得以充分利用。 3. 高性能:SQL ...

    VC连接 SQL Server

    在VC++环境中,连接SQL Server是一项常见的任务,用于实现C++程序与数据库的交互。本文将详细介绍如何在Visual C++(VC)中建立与SQL Server的连接,包括所需的库、API函数、步骤以及可能遇到的问题。 首先,我们...

    SQL Server索引进阶之索引的内部结构

    理解索引的内部结构对于整体的理解索引是至关重要的,只有理解了索引的内部结构以及SQL Server是如何维护索引的,你才能理解数据插入,删除,更新,索引的创建、修改、删除所带来的成本。  叶子层级和非叶子层级 ...

    SQL Server 2005数据库开发与实现习题

    ### SQL Server 2005数据库开发与实现习题解析 #### 第1题:处理外键约束中的数据导入问题 **题目背景**:本题旨在考察考生如何在数据迁移过程中处理外键约束的问题,特别是在源数据库(SQL Server 2000)与目标...

    asp+sql server

    7. **性能优化**:ASP+SQL Server应用需要注意性能优化,如合理设计数据库表结构、使用索引、避免冗余查询、批量处理数据等。 8. **安全性考虑**:防止SQL注入攻击是ASP与SQL Server结合时必须重视的问题。应使用...

    sql server视图详解

    在SQL Server数据库管理系统中,视图是数据库设计和数据查询中的一个重要概念。视图可以被理解为一个虚拟的表,它并不实际存储数据,而是基于一个或多个表或视图的SELECT语句结果集。视图是数据库对象,提供了一种...

    Sql Server查询优化

    本文主要探讨了Microsoft SQL Server中的查询优化技术,以及影响其性能的主要因素,并针对每一个问题提供了相应的解决方案。 首先,Microsoft SQL Server是一个关系型数据库管理系统,它使用MS-SQL和Transact-SQL...

Global site tag (gtag.js) - Google Analytics