堆是一個不含叢集索引的資料表。 您可以在儲存為堆積的數據表上建立一或多個非叢集索引。 數據會儲存在堆中,不指定順序。 通常數據會以數據列插入數據表的順序儲存,但 Database Engine 可以在堆積中移動數據,以有效率地儲存數據列;因此無法預測數據順序。 若要保證從堆積傳回的數據列順序,您必須使用 ORDER BY 子句。 若要指定資料列儲存的順序,請在數據表上建立叢集索引,讓數據表不是堆積。
備註
有時候有充分的理由將數據表保留為堆,而不是建立叢集索引,但要有效地利用堆需要進階技能。 大部分的數據表都應該有經過精心選擇的叢集索引,除非有充分的理由將數據表保留為堆積。
使用堆的時機
如果數據表是堆積,而且沒有任何非叢集索引,則必須檢查整個數據表(數據表掃描),以尋找任何數據列。 當數據表很小時,這可以接受,例如公司 12 個區域辦公室的清單。
當數據表儲存為堆積時,會以數據列標識碼 (RID) 的參考來識別個別數據列,其中包含頁面上的檔案編號、數據頁碼和位置。 數據列標識碼是小型且有效率的結構。 有時候,當資料通常透過非叢集索引存取,且 RID 小於叢集索引鍵時,資料架構設計人員會使用堆表。
何時不使用堆
當數據經常以排序順序傳回時,請勿使用堆積。 排序數據行上的叢集索引可以避免排序作業。
當數據經常分組在一起時,請勿使用堆疊。 數據必須在分組之前進行排序,而且排序數據行上的叢集索引可以避免排序作業。
當經常從數據表查詢數據範圍時,請勿使用堆積。 在範圍欄位上建立叢集索引將避免排序整個堆疊。
當沒有非叢集索引且數據表很大時,請勿使用堆積。 在堆積中,必須讀取堆積的所有數據列,才能尋找任何數據列。
管理堆積
若要建立堆積,請建立不含叢集索引的數據表。 如果表格已經有叢集索引,請卸除叢集索引,將表格還原為堆。
若要移除堆積,請在堆積上建立叢集索引。
若要重建堆積以回收浪費的空間,請在堆積上建立叢集索引,然後卸除該叢集索引。
警告
建立或卸除叢集索引需要重寫整個數據表。 如果數據表有非叢集索引,則每當叢集索引變更時,都必須重新建立所有非叢集索引。 因此,從堆積變更為叢集索引結構或返回可能需要很多時間,而且需要磁碟空間才能在tempdb中重新排序數據。