2017-04-22 73 views
3

考慮下面的SQL Server表:使用羣集與非羣集索引上的大數據在SQL

  • 員工(SSN,姓名,部門,經理,薪水)

其中ssn是首要的關鍵。

假設每個磁盤塊有30個員工記錄。每個員工都屬於其中一個部門。解釋爲什麼你應該或不應該放在一個dept非聚簇索引,以加快此查詢在以下兩種情況:

SELECT ssn 
FROM Employee 
WHERE dept = 'IT' 
  • 時,有50個部門
  • 時,有5000個部門

我對SQL Server中的聚簇索引和非聚簇索引的基本理解是,當有大量數據要返回時應該使用聚簇索引,因爲它們最初將按該索引對錶進行排序。因此,我認爲在第二種情況下,如果有5000個部門,則不應該dept上放置非聚類索引以加快查詢速度。

我對第一種情況感到困惑,因爲只有50個部門,如果使用非集羣或集羣索引,真的很重要嗎?我認爲這可能很重要的唯一原因是,如果聚類索引需要額外時間來首先對數據進行排序,而非聚類索引則不需要。

在這兩種情況下應該使用哪種聚類或非聚類索引?

+0

在這兩種情況下以及未來,無論有多少數據,我都會在SSN上添加一個集羣,並在該集羣上添加一個非集羣。作爲一項規則,非聚簇索引取決於您的查詢。例如,如果您不在該表中按部門進行搜索,則不應創建它,否則請執行此操作。你不想爲部門有一個單獨的表嗎? – hastrb

回答

1

我應該在這兩個 個案中使用哪個聚類或非聚類指標?

將SSN作爲主鍵聚簇索引時,部門上的非聚簇索引將覆蓋查詢並且無論返回的行數是多少都是最有效的。請記住,聚簇索引鍵(此處爲主鍵)作爲行定位符隱式包含在非聚簇索引葉節點中。這將避免需要訪問包含查詢不需要的列的單獨數據頁面。

執行計劃應僅顯示使用部門非聚集索引的索引查找,僅觸及查詢所需的數據。

0

問題是缺少一個重要參數 - 有多少員工?

如果50個部門中有100名員工,則掃描數據而不是在索引和數據之間反彈便宜。

如果50個部門有10000名員工,則在索引和數據之間反彈會更便宜。

查詢優化器應該足夠聰明來決定。

還取決於'IT'是否是一個大部門。

底線:有索引,並希望優化器不會搞砸它。