在已經存在主鍵約束的鍵上添加聚簇索引是不必要的重複。相反,主鍵約束也應該是聚集索引。然而,你的問題其實是不同的...
是CustomerId列適合聚集索引的候選人嗎?
如果不知道,你將如何回答這個問題。有許多查詢模式,這個組織將而不是是最優的(典型例子是時間序列,其中時間列是適當的集羣密鑰)。而且這個是最好的聚集索引。無法回答。
假設ID字段是主鍵,SQL Server是否仍然需要'唯一化'聚集索引?
如果指數不聲明唯一那麼SQL Server將添加唯一標誌列。儘管如此,的值永遠不會實現,因爲不會有重複發生。
我有一個「消息」表,這是在一個聊天應用程序... WHERE CustomerId = @Id
使用... ID字段是主鍵
對不起,但這不作任何感。你所說的是,Messages
表只能從每個客戶只有一條消息。那會造成可怕的聊天體驗。我很確定你的解釋是錯誤的。
我期望Customers
表聚合索引和主鍵約束CustomerId
。該Messages
表很可能是由聊天室,或其他一些團體組織,對聊天參與者來組織。如果在一個客戶和一個代表之間的聊天內容爲總是,那麼'聊天室'可能就是客戶本身。無論如何,這種Messages
表的典型查詢將想要所有在聊天室中交換的消息,所發佈的訂單發佈或所有與客戶交換的消息,發佈順序爲。實際上,這是一個分區時間序列,最適合聚集索引,如(chat_id, post_time)
或(customer_id, post_time)
。請注意,這不是的主鍵,該表可能有message_id
作爲主鍵,但非集羣。
@GordonLinoff使一個有效的點,像'一個聚集鍵(chat_id,post_time)'因爲數據被插入在指數多點導致了分裂,但在我的經驗,當* *它成爲一個問題,就是可以通過簡單的重組來解決,或重建(最終使用低fill_factor)。選擇一個聚集索引來確保物理組織的僅附加語義,並懲罰過程中的查詢通常會更糟糕。 –
'@Id'應該是作爲傳入存儲過程的參數的客戶ID。所以,你會通過他們的Id查找所有消息給客戶。這是一個寫得不好的例子。是的,在這種情況下,'客戶ID'基本上是聊天室標識符。 –