1

我已经阅读了有关主索引、唯一索引、聚集索引等的信息。但我需要通过一个示例来理解它。

下图是从 SQL Server Web 管理面板捕获的自动生成的 aspnet_Users 表。

自动生成的 ASP.NET 用户表 http://eggshelf.com/capture.jpg

以此为模型;我将创建一个名为 Companies 的自定义表,假设字段为:ID、Name、ShortName、Address、City、Country.. ID、Name 和 ShortName 字段的值不能重复。

您为该表创建索引的方法是什么?哪个应该是集群的或非集群的?下面的索引对你来说合乎逻辑吗?

Index          Columns         Primary    Unique    Clustered    ign.Dup.Keys   Unique Key
------------------------------------------------------------------------------------------
PK_ID          ID              True       True      False        False          False
Comp_Index     Name,ShortName  False      True      True         False          False

问候..

4

3 回答 3

2

索引与表结构无关,而与访问模式有关。

您需要了解如何查询表中的数据并相应地创建索引。

WHERE经验法则是考虑在子句中常用的字段上定义索引。

请参阅有关该主题的博客文章。

更新

您只能在表上定义单个聚集索引。正如您在示例中所做的那样,这通常在表的标识字段上完成。

其他索引将是非聚集的。

关于另一个(非聚集)索引 - 如果您只打算让查询包含WHERE子句中的两个字段,并且ORDER BY将有一个主要排序Name(而不是主要排序 on ShortName)。这样做的原因是,这就是索引的存储方式——首先是 on Name,然后是 on ShortName

但是,如果您将在子句中ShortName用作或不用作主排序,则最好使用两个索引,每个索引一个。NameWHERE

于 2010-07-22T08:40:33.217 回答
1

Oded 是正确的 - 索引(集群和非)都是关于性能的,需要对查询类型有深入的了解。

例如,如果 ShortName 和 Name 都被独立查询,您可能希望 ShortName 和 Name 有单独的非聚集索引。如果您需要强制唯一性,请使用 UNIQUE INDEX(或将 UNIQUE CONSTRAINTs 添加到 ShortName 和 Name)。ID 已经是唯一的,因为它是 PK。

如果您更了解如何从公司表中获取数据,您还可以更改聚集索引(从其默认 ID)

于 2010-07-22T08:57:18.013 回答
1

阅读Brad 的 Sure Guide to Indexes,快速全面了解 SQL Server索引

通常,在没有执行任何查询分析的情况下,您的起点将是:

  • 主键列可以成为聚集索引的良好候选者(通常取决于使用的数据类型和键宽度)。
  • 您应该在外键列上创建非聚集索引。
  • 您应该根据您的查询在 SARG 列上创建非聚集索引。

然后看看这些通用索引技巧

于 2010-07-22T10:33:18.050 回答