2010-07-22 54 views
1

我讀過關於主要,唯一,聚集索引等的內容,但我需要通過一個例子來理解它。在自定義SQL表上設置索引列

下圖是從SQL Server Web管理面板捕獲的自動生成的aspnet_Users表。

Auto-generated ASP.NET Users Table http://eggshelf.com/capture.jpg

以此爲模型;我將創建一個名爲Companies的自定義表格,並假設這些字段是:ID,名稱,短名稱,地址,城市,國家。對於ID,名稱和短名稱字段,沒有值可以重複。

你爲這個表創建索引的方法是什麼?哪些應該是羣集或非羣集?索引低於邏輯嗎?

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 

問候..

回答

1

圍棋和閱讀Brad's Sure Guide to Indexes

通常情況下,獲得SQL Server索引的快速全面瞭解具有不進行任何查詢分析您的出發點是:

  • 主鍵列可以使一個很好的候選人聚集索引(通常取決於所使用的數據類型和密鑰長度)。
  • 您應該在外鍵列上創建非聚簇索引。
  • 您應該在查詢中的SARG列上創建非聚集索引。

然後看看這些generic index tips

+0

非常感謝您的幫助。 – 2010-07-23 08:18:16

+0

不客氣! – 2010-07-23 14:14:01

2

索引是不是表結構,但對訪問模式。

你需要看你如何查詢表中的數據並相應地創建你的索引。

經驗法則是考慮在WHERE子句中常用的字段上定義索引。

查看this關於這個問題的博客文章。

更新

只能定義在表中的一個聚集索引。這通常在表格的標識字段上完成,就像你在示例中所做的那樣。

其他索引將是非羣集的。

在關於其他(非羣集)的索引 - 如果你打算只具有含WHERE子句中的兩個字段的查詢和ORDER BY將有一個主排序上Name(而不是一個主排序上ShortName )。原因是這是指數將如何儲存 - 首先在Name,然後在ShortName

但是,如果您將在WHERE子句中使用ShortName作爲主要排序或不使用Name,則最好使用兩個索引,每個索引各一個。

+0

感謝您的回答。我明白這一切都與訪問模式有關。但是(在上面的例子中)我需要知道是否需要以及爲什麼需要在ID,Name和/或ShortName上使用集羣索引或非集羣索引。 – 2010-07-22 09:20:25

+0

@radgar - 答案已更新。 – Oded 2010-07-22 09:33:05

1

Oded是正確的 - 索引(集羣和非集羣)都是關於性能,並且需要關於查詢類型的深入知識。

例如如果同時查詢短名稱和名稱,則可能需要爲短名稱和名稱分別使用非聚集索引。 如果您需要強制唯一性,請使用UNIQUE INDEX(或將唯一約束條件添加到ShortName和Name)。 ID已經是唯一的,因爲它是PK。

如果您更瞭解如何獲取公司表中的數據(例如,如何獲取數據),還可以更改羣集索引(從其缺省ID開始)。對城市羣,如果它是常見的做法是在一個城市一次等獲取所有公司)