SQL Server 2005/2008 表索引概述(第一部分)






4.91/5 (41投票s)
SQL Server 2005/2008 表索引的基本概述
目录
- 概述
- 什么是索引?
- 为什么要使用索引?
- 索引的类型?
- 唯一性
- 创建表
- 创建索引
- 7.1 创建索引 - 表设计器
- 7.2 创建索引 – Transact-SQL
- 7.3 删除索引
- 索引和统计信息
- 摘要
- 参考文献
- 历史
1. 概述
人类的需求急剧增加。现在人们正在做比以往任何时候都更复杂的任务。社会变得非常复杂,一个人每天都必须处理大量信息。为了处理海量信息,我们必须有一个系统,可以在其中存储、操作和共享信息。这是当今引入数据库管理系统 (DBMS) 以及关系数据库管理系统 (RDBMS) 的核心原因之一。
所以,我们清楚了一点,我们将数据/信息存储和操作到数据库中,数据库包含各种类型的表来存储各种类型的数据/信息。
开发人员可以创建数据库表;我们可以在这一点停止并从这里开始处理数据。然而,这并不是我们最好的选择,但为什么呢?因为它对更好的性能来说不是一个好主意,让我们举个例子
“一个图书馆收藏了大量的书籍、文件等……一个学生向图书馆管理员请求一本 Microsoft SQL Server 2008 的书,如果我们不考虑索引,图书馆管理员必须在没有任何帮助的情况下找到这本书,他/她必须一本一本地搜索!这肯定会很耗时;所以,通过适当的安排,也就是在索引的帮助下,找到所需书籍会非常容易和快速。”
创建索引的方法有很多,但首先我们需要了解什么是索引以及它在 SQL Server 中是如何维护的。
2. 什么是索引?
SQL 表的解释不足以快速获取所需数据或按特定顺序排序数据。我们实际需要的是某种交叉引用设施,其中对于表中信息的某些列,应该能够快速获取整条信息记录。但是如果我们在表中考虑大量数据,我们需要某种交叉引用才能非常快速地获取数据。这就是 SQL Server 中索引的作用。
因此,索引可以定义为
- “索引是与表或视图关联的磁盘结构,可加快从表或视图中检索行的速度。索引包含根据表或视图中的一列或多列构建的键”。这些键存储在一种结构(B 树)中,使 SQL Server 能够快速高效地查找与键值关联的行或行集。”
- “索引是由 DBMS 创建和维护的数据库对象。它本质上是列或列组内容的列表。索引是有序的,因此可以通过它们计算出极快的搜索来查找数据。”
3. 为什么要使用索引?
使用 SQL Server 索引提供了许多功能,例如
- 快速访问信息
- 高效访问信息
- 强制实施唯一性约束
正确使用索引可以使数据库从高性能、高客户满意度变为低性能、低客户满意度。
4. 索引的类型
SQL Server 有两种主要的索引类型
- 聚集索引
- 非聚集索引
索引类型指的是 SQL Server 内部存储索引的方式。因此,表或视图可以包含这两种类型的索引。
4.1 聚集索引
定义为聚集索引的索引,定义了表中数据存储的物理顺序。每个表只能定义一个聚集索引。因此,它可以定义为
- 聚集索引根据其键值对表或视图中的数据行进行排序和存储。这些是索引定义中包含的列。每个表只能有一个聚集索引,因为数据行本身只能按一种顺序排序。
- 表中数据行以排序顺序存储的唯一时间是当表包含聚集索引时。当表具有聚集索引时,该表称为聚集表。如果表没有聚集索引,则其数据行存储在称为堆的无序结构中。
4.2 非聚集索引
由于非聚集索引存储在与基表分开的结构中,因此可以在与基表不同的文件组上创建非聚集索引。因此,它可以定义为
- 非聚集索引的结构与数据行是分开的。非聚集索引包含非聚集索引键值,每个键值条目都有一个指向包含该键值的数据行的指针。
- 从非聚集索引中的索引行到数据行的指针称为行定位符。行定位符的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位符是指向行的指针。对于聚集表,行定位符是聚集索引键。
- 您可以将非键列添加到非聚集索引的叶级别,以绕过现有的索引键限制(900 字节和 16 个键列),并执行完全覆盖的索引查询。
有关索引的更多信息可以在此链接找到。
聚集索引和非聚集索引都可以是唯一的。这意味着没有两行可以为索引键具有相同的值。否则,索引不是唯一的,多行可以共享相同的键值。
注意:每当修改表数据时,索引都会自动为表或视图维护。
5. 唯一性
索引可以定义为唯一或非唯一。唯一索引确保唯一索引列中包含的数据在表中只出现一次,包括“NULL
”。唯一索引通常用于支持约束。
SQL Server 自动强制唯一索引中包含的列的唯一性。如果尝试INSERT
表中已存在的值/数据,则 SQL Server 将生成错误,并且最终INSERT
数据的尝试将失败。
非唯一索引也适用,因为可能存在重复数据;检索数据时,非唯一索引比唯一索引具有更多的开销。
6. 创建表
什么是表?每个关系数据库管理系统的基础都是一个称为表的数据库对象。每个数据库都包含一个或多个表,这些表存储数据库的数据/信息。每个表都有自己唯一的名称,并由列和行组成。
创建表的语法
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > } [ ,...n ]
)
在本文中,我们将不讨论数据库表。我希望每个人都了解数据库表的基本概念。
有关数据库表的更多信息可以在
7. 创建索引
正如我们讨论了什么是索引、为什么要使用索引、索引的类型等,我们现在将讨论如何创建索引。创建索引有两种方法,如下所示
- 使用 SQL Server 表设计器创建索引
- 使用 Transact-SQL 创建索引
7.1 使用 SQL Server 表设计器创建索引
SQL Server 表设计器是一个出色的功能,用于管理各种表的设计创建、修改、索引等等。在这里,您需要按照以下步骤使用 SQL 表设计器创建索引。
步骤
- 打开 SQL Server Enterprise Management Studio,然后选择您的数据库以创建表索引。现在选择您想要的表并打开表设计窗口。下图显示了如何执行此操作。图 1(如何打开 SQL 表设计器)
- 将出现一个窗口,您将在其中找到所有可用于创建表的输入。您只需输入列名、数据类型长度,您还可以设置列是否允许
null
值。请注意,您可以设置列的默认值。下图将向您展示如何执行所有这些操作图 2(如何设置表列、数据类型、长度等) - 好了,现在您知道如何创建表了。让我们看看如何在表中设置索引。通过单击鼠标按钮选择列,将出现一个新弹出菜单,选择/单击“索引/键”以打开一个新窗口,您可以在其中配置用于索引的列。下图将显示如何设置索引。图 2.1 (A)(如何配置索引)图 2.1 (B)(如何配置索引)
- 现在您只需从常规属性中选择列,如图 3 所示,并添加指定列的索引短序。图 4(如何设置聚集索引)
您可以从“创建为聚集”属性中将索引配置为聚集或非聚集。图 4 显示了聚集或非聚集索引的默认配置。
因此,我们讨论了如何使用 SQL Server 表设计器创建索引。让我们尝试使用 Transact-SQL 创建索引。
7.2 创建索引 – Transact-SQL
如果我们要使用 Transact-SQL 创建索引,我们必须了解用于索引创建的列详细信息。下面给出了一个示例语法。
语法
CREATE INDEX <index_type> <index_name> ON <table_name> (
<column_name1> <index_order>,
<column_name2> <index_order>,
)
CREATE UNIQUE INDEX <index_type> <index_name> ON <table_name> (
<column_name1> <index_order>,
<column_name2> <index_order>,
)
7.3 删除索引
从当前数据库中删除一个或多个索引。
DROP INDEX
语句不适用于通过定义PRIMARY KEY
或UNIQUE
约束(分别使用CREATE TABLE
或ALTER TABLE
语句的PRIMARY KEY
或UNIQUE
选项创建)创建的索引。有关PRIMARY
或UNIQUE KEY
约束的更多信息,请参阅本卷中的“CREATE TABLE
”或“ALTER TABLE
”。
语法
DROP INDEX 'table.index | view.index' [ ,...n ]
有关删除索引的更多信息可以在此链接找到。
8. 索引和统计信息
检索数据时,SQL Server 显然必须就获取数据并将其返回给请求它的查询的最佳方式做出一些决策。因此,SQL Server 拥有一些基本信息来做出明智而准确的选择。这就是统计信息的作用。SQL Server 在每个列上都保留统计信息,这些统计信息会在一段时间内以及在多次插入或修改后进行更新。
有关索引和统计信息的更多信息可以在此链接找到。
9. 总结
在本文中,我尝试涵盖 SQL 表索引。我讨论了我们为什么要使用索引以及它们如何用于快速高效地检索表中存储的数据。我还讨论了各种类型的索引、如何创建/删除索引、索引唯一性和索引统计信息。
希望这篇文章对您有所帮助。祝您阅读愉快!
10. 参考文献
- SQL Server 联机丛书
- Microsoft 开发网络 (MSDN)
- Robin 的 SQL Server 编程
- http://www.infogoal.com/
- http://www.developer.com/
11. 历史记录
- 2009 年 8 月 16 日:初次发布
- 2009 年 8 月 26 日:修订