- 浏览: 613943 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (240)
- 程序员数学/线性代数(Linear Algebra) (2)
- 程序员数学/微积分(Calculus) (6)
- 机器学习(Machine Learning) (5)
- JAVA SE (63)
- JAVA EE (14)
- 数据库技术 (26)
- struts (4)
- 软件设计/设计模式 (0)
- ibatis (2)
- XML (4)
- 领域建模 (0)
- 数据资源共享 (1)
- 软件工程 (11)
- 技术以外 (6)
- 面向对象 (2)
- 科学数据共享 (1)
- 资源 (7)
- WEB2.0 (11)
- 电子商务 (10)
- 算法、数据结构、数学 (10)
- LAMP (1)
- 杂谈 (12)
- C语言 (7)
- 程序设计思想 (3)
- 读书和笔记 (1)
- 生活 健身 养生 (5)
- WEB UI (2)
- eclipse (2)
- 项目管理 (7)
- oracle (5)
- linux (1)
- webGIS (6)
最新评论
-
TimePower:
OK~终于明白了~~
参数(parameter)和属性(Attribute)的区别 -
OnTheRoad_lee:
不错,正式我想要的东西,一直不明白序列化是什么?有什么用?至此 ...
我对Java Serializable(序列化)的理解和总结 -
EchoZhouYou:
好久不上这,找这本书时发现这一篇,特意登录来赞一下
《程序设计语言——实践之路》读后感 -
yong7356:
学习一下Serializable
我对Java Serializable(序列化)的理解和总结 -
dengjm_2012:
写得不错!
我对Java Serializable(序列化)的理解和总结
页和盘区(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来访问到对应数据页中的值。
注意事项
非聚集索引适用于以下场景:
聚集索引(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列上创建一个聚集索引。
注意事项
在创建聚集索引时,索引列应该尽量少,这一点很重要。如果定义一个大的索引码,那么该表中的任何非聚集索引就会显著的增大,因为每个非聚集索引叶级索引条目都包含了一个聚集索引码。
聚集索引适用于以下场景:
聚集索引不适合以下场景:
你的表(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)聚集索引的索引码被所有的非聚集索引来用来检索,所被存储在每个非聚集索引的叶级索引条目中。
发表评论
-
百万级数据查询优化
2011-03-07 14:12 14501.对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ... -
死锁反反复复反反复复方法
2010-05-20 14:24 0其实所有的死锁最深层的原因就是一个:资源竞争 表现一: ... -
索引总结
2010-04-13 13:57 1424提高SQL Server性能最重要的方面之一就是提供正确的索引 ... -
选择索引:查询VS 修改性能
2010-04-13 13:55 1872I/O是决定查询性能的主 ... -
视图索引(Indexed Views)
2010-04-13 13:50 2265正如第27章所讲的那样 ... -
评价索引的有效性(Evaluating Index Usefulness)
2010-04-13 13:39 1972SQL Server提供索引主要有两个原因:其一是作为一种保证 ... -
索引和性能
2010-04-13 13:23 1404主要内容包括: 索引使用标准(Index Usage Cri ... -
SQL Server中三种查找数据方法的比较
2010-04-13 13:18 2452在SQL Server中主要有有三种方式可以查找数据,分别是: ... -
SQL Server性能调优指南
2010-04-13 09:48 2619经过几个月断断续续,比较系统学习,终于对数据库优化中所涉及到的 ... -
数据库性能调优概观
2010-04-11 19:24 2109一般而言,影响数据整体性能的因素如图所示。 若数据库设 ... -
最近需要掌握技术
2010-03-01 17:30 01、左右内全连接查询性能方面的比较 2、视图与连接查询时的性能 ... -
索引介绍
2010-01-04 06:50 0SQL Server : Nested transaction ... -
索引统计(Index Statistics)
2009-12-03 10:56 2006正如前面提到的,键的选择性是决定当执行一个查询时是否使用索引的 ... -
索引设计指南( Index Design Guidelines)
2009-12-02 16:51 1487SQL Server的索引对用户和T-SQL开发者来说几乎是透 ... -
评价索引的有效性(Evaluating Index Usefulness)
2009-10-29 15:29 1151SQL Server提供索引主要有两个原因:其一是作为一种实施 ... -
索引的选择(Index Selection)
2009-10-29 13:56 1160当决定在表中创建哪些索引时要对应用中查询进行仔细分析。具体包括 ... -
索引使用标准(Index Usage Criteria)
2009-10-27 17:13 1714索引使用标准(Index Usage Criteria) ... -
索引和性能(Indexs and Performance)
2009-10-27 15:24 1153索引和性能(Indexs and Pe ... -
SQL Server 2000索引实现内幕
2009-10-19 16:58 1622翻译自:Microsoft SQL Server 2000 U ... -
SQL Server迁移到ORACLE相关资料收集
2009-10-12 11:16 01|、http://blog.163.com/shenlian ...
相关推荐
SQL Server中的视图、事务和索引是数据库管理中的核心概念,它们各自扮演着重要的角色,帮助用户更高效、安全地操作和查询数据。 视图,作为数据库的一种抽象,是基于一个或多个表的SELECT查询结果集的逻辑表示。在...
这个组件在64位操作系统中尤其重要,因为它提供了对64位数据源的支持,确保了与SQL Server 2008 R2等64位数据库系统的高效通信。 1. **ODBC接口**: ODBC是SQL Server Native Client 10.0中的关键部分,它是一个...
2. **支持新特性**:包括对SQL Server 2008引入的新特性如FILESTREAM、透明数据加密(TDE)、Change Data Capture (CDC) 和列存储索引的支持。 3. **连接池**:通过ODBC和OLE DB接口实现连接池管理,提高资源利用率...
- **事务处理**:阐述了事务的基本概念及其在SQL Server中的实现方式,包括如何使用BEGIN TRANSACTION、COMMIT和ROLLBACK语句来确保数据的一致性和完整性。 #### 四、性能优化与最佳实践 为了帮助读者更好地利用...
5. 支持SQL Server的XML数据类型:SQL Server 2008引入了对XML的原生支持,Native Client能够处理XML数据的输入和输出,包括XML索引和XML数据的查询。 6. 支持ADO.NET:尽管不是直接的组成部分,但Native Client与...
开发人员可以利用SQL Server Native Client的API在C++、VB.NET、C#等编程语言中创建应用程序,实现高效、安全的数据库访问。同时,它也可以被数据库管理工具和ETL(提取、转换、加载)工具所使用。 6. **升级与...
SQLSERVER 绿色版 6.5.2.1 源代码的发布,为开发者提供了一次深入了解和学习微软SQL Server数据库系统内部工作原理的机会。这个版本是基于D7编译的,意味着它可能使用的是Delphi 7编程语言进行开发,这是一种流行的...
《SQLServer2005.技术内幕四部曲中文PDF》是一套全面解析SQL Server 2005核心技术的中文教程,包含了T-SQL查询、T-SQL程序设计、存储引擎以及查询、调整和优化四个重要方面。这套书籍旨在帮助IT专业人员深入理解SQL ...
SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,而SQL Server 2005作为微软公司的一款强大的数据库管理系统,为开发者提供了广泛的功能和工具,使其在数据库管理和开发领域中占据重要地位...
T-SQL(Transact-SQL)是用于与SQL Server交互的主要编程语言,书中会详细讲解如何编写查询、更新、插入和删除语句,以及如何使用存储过程和触发器来实现更复杂的业务逻辑。T-SQL的优化技巧也是重要一环,包括索引的...
在实现过程中,开发者通常会使用ADO (ActiveX Data Objects) 或 OLE DB 技术来建立VB与SQL Server 2000之间的数据连接。ADO是微软提供的一组接口,用于访问各种数据库,而OLE DB是更底层的数据库访问接口,支持多种...
此外,随着XML在数据交换中的广泛应用,SQL Server 2000提供了对XML的内置支持,包括XML数据类型、XML索引和XML函数。 七、分析服务和数据仓库 SQL Server 2000的分析服务(OLAP和数据挖掘)为企业提供了强大的商业...
2. 支持新功能:SQL Server 2008引入了多项新特性,如列存储索引、透明数据加密(TDE)、Policy-Based Management等。SQL Server 2008 Native Client使得这些新功能在应用程序中得以充分利用。 3. 高性能:SQL ...
在VC++环境中,连接SQL Server是一项常见的任务,用于实现C++程序与数据库的交互。本文将详细介绍如何在Visual C++(VC)中建立与SQL Server的连接,包括所需的库、API函数、步骤以及可能遇到的问题。 首先,我们...
理解索引的内部结构对于整体的理解索引是至关重要的,只有理解了索引的内部结构以及SQL Server是如何维护索引的,你才能理解数据插入,删除,更新,索引的创建、修改、删除所带来的成本。 叶子层级和非叶子层级 ...
### SQL Server 2005数据库开发与实现习题解析 #### 第1题:处理外键约束中的数据导入问题 **题目背景**:本题旨在考察考生如何在数据迁移过程中处理外键约束的问题,特别是在源数据库(SQL Server 2000)与目标...
7. **性能优化**:ASP+SQL Server应用需要注意性能优化,如合理设计数据库表结构、使用索引、避免冗余查询、批量处理数据等。 8. **安全性考虑**:防止SQL注入攻击是ASP与SQL Server结合时必须重视的问题。应使用...
在SQL Server数据库管理系统中,视图是数据库设计和数据查询中的一个重要概念。视图可以被理解为一个虚拟的表,它并不实际存储数据,而是基于一个或多个表或视图的SELECT语句结果集。视图是数据库对象,提供了一种...
本文主要探讨了Microsoft SQL Server中的查询优化技术,以及影响其性能的主要因素,并针对每一个问题提供了相应的解决方案。 首先,Microsoft SQL Server是一个关系型数据库管理系统,它使用MS-SQL和Transact-SQL...