我已经阅读了关于主要的,独特的,聚集的索引等。但我需要通过一个例子来理解它。
下图是从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
问候..
答案 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索引通常,如果没有执行任何查询分析,您的起点将是:
然后看看这些generic index tips。