2012-08-15 106 views
0

我想問一下使用字段SalesOrderId作爲主鍵的一部分的實際原因。我認爲這應該只是表SalesOrderHeader的一個外鍵。SQL Server Adventureworks SalesOrderDetail表主鍵

在此先感謝

+0

你的問題不是很清楚,因爲你沒有分享你的模式和其他細節,但我想這個鏈接會對你有幫助http://database-programmer.blogspot.in/2008/01/database-skills -sane-approach-to.html – yogi 2012-08-15 16:40:21

回答

0

好一點有關指標有多發性類型。有一個聚集索引決定數據在磁盤上的物理順序,沒有這個表在技術上被稱爲堆。訪問大量數據效率不高。數據是隨機的。任何非聚集索引(以及有關數據分佈的統計數據)都將引用有聲索引來訪問數據。建立索引時,查詢優化器將使用來自左側的索引列來查找數據。所以,如果我有一個索引col1,col2,col3,如果我正在加入,搜索或col1上的任何內容,索引將被使用。如果在col1,col2上進行Im過濾,則會使用相同的索引。這很少或沒有懲罰。如果我的查詢僅引用col1,col2,col3(包括where和返回的列等),則只需讀取索引即可確認要返回的信息,而不需要訪問它自己的表。這被稱爲覆蓋指數。所以這很快。一般來說,表格應該很窄,索引很寬。要了解更多,我推薦http://www.insidesqlserver.com/thebooks.html Kalen Delany:她親自了解SQL開發團隊並寫得非常清楚。從SQL7到SQL2012的基本原理依然如此 - 雖然已經添加了sparce索引,空間數據類型,BI和許多其他好東西。

+0

感謝您的詳細信息,但問題仍然存在。我沒有看到SalesOrderDetail表中的複合主鍵的原因。 SalesOrderDetailId字段是一個標識列。雖然SalesOrderDetailID可能是它自己的主鍵,但我認爲AdventureWorks設計團隊選擇將它作爲SalesOrderID和SalesOrderDetailID的組合鍵,因爲它也是集羣鍵,並且他們預計插入按SalesOrderID升序排列,並且不需要在SalesOrderID上有第二個索引。 – 2012-08-16 14:16:16

+0

好的,所以你清楚地知道發生了什麼,所以基本的上下文的appologies。我想你已經回答了你自己的問題。如果SalesOrderDetail變得非常大,如果單個訂單的詳細信息在物理上位於磁盤上,它將有助於縮短檢索時間。如果這可能出現這種情況,它會給查詢優化器提供額外的信息:「是的,這些記錄是在一起的,因此我會在一次閱讀中得到它們」,與此相對的是一些主細節安排,細節可以分散整個桌子。 – 2012-08-17 08:13:31

+0

是的,我知道這不太可能,如果它的順序和順序細微,但SQL優化器沒有這個世俗的上下文(除非你通過複合聚集索引來告訴它)。我認爲這就是他們所得到的,而且你是對的,對於主細節來說,它通常不是一個好主意,因爲它肯定會影響插入性能,尤其是如果你沒有在桌子上填充空間。以防萬一fillfactor http://msdn.microsoft.com/en-us/library/ms177459.aspx所以實際上,我認爲這是一個非常好的問題,一旦我們進入它的底部。 – 2012-08-17 08:19:57