在自定义SQL表上设置索引列

时间:2010-07-22 08:37:52

标签: asp.net sql-server primary-key indexing clustered-index

我已经阅读了关于主要的,独特的,聚集的索引等。但我需要通过一个例子来理解它。

下图是从SQL Server Web Admin Panel捕获的自动生成的aspnet_Users表。

Auto-generated ASP.NET Users Table 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

问候..

3 个答案:

答案 0 :(得分:2)

索引不是关于表结构,而是关于访问模式。

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

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

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

<强>更新

您只能在表上定义单个聚簇索引。这通常在表的标识字段上完成,就像在您的示例中一样。

其他索引将是非群集的。

关于其他(非群集)索引 - 如果您打算只在WHERE子句中包含两个字段的查询,而ORDER BY将在{{1}上进行主要排序(而不是Name上的主要排序)。原因在于这就是索引的存储方式 - 首先在ShortName上,然后在Name上。

但是,如果您在ShortName子句中使用ShortName作为主要排序或没有Name,那么最好使用两个索引,每个索引一个。

答案 1 :(得分:1)

Oded是对的 - 索引(Clustered和non)都与性能有关,需要有关查询类型的深入了解。

e.g。如果同时查询ShortName和Name,则可能需要为ShortName和Name分别设置Non Clustered索引。 如果需要强制唯一性,请使用UNIQUE INDEX(或将UNIQUE CONSTRAINT添加到ShortName和Name)。 ID已经是唯一的,因为它是PK。

如果您了解有关如何获取公司表中的数据的更多信息,您还可以更改聚集索引(来自其默认ID)(例如,如果通常的做法是一次性获取城市中的所有公司,则可以更新城市上的群集等)

答案 2 :(得分:1)

通过阅读Brad's Sure Guide to Indexes

,快速全面了解SQL Server索引

通常,如果没有执行任何查询分析,您的起点将是:

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

然后看看这些generic index tips