2014-07-08 66 views
2

目前我有一個龐大的用戶表,有數百萬行我認爲,並且該用戶表通過UserTypeJoin錶鏈接到UserType表。由於UserType表的所有聯接,搜索和篩選需要很長時間。SQL Server - 非規範化連接表以提高性能

我已經研究過使用索引視圖,看起來不錯,但是當我嘗試創建聚集索引時,我被告知聚集索引無法應用於左連接的視圖。並不是所有的用戶都有一個UserType,所以我需要做一個左連接。

所以現在我認爲反規範化是我最好的方法。

我現在的表結構看起來是這樣的:

USER 
UserId 
UserName 
Sex 
Description 

USER TYPE JOIN 
UserId 
UserTypeId 

USER TYPE 
UserTypeId 
Name 

而且我想改變結構來此的:

USER 
UserId 
UserName 
IsUserTypeX bit 
IsUserTypeY bit 
IsUserTypeZ bit 
etc... 

用戶可以有UserTypes 11之間0和。

我會針對我的數據運行的一個典型查詢是使用他們的姓名,性別,描述或用戶類型或這些屬性的組合來搜索用戶。

這些表主要用於搜索,而不是用於寫入,而且我最近做的所有研究都告訴我,讀密集表應該是非規範化的。

這是我在這種情況下的最佳選擇嗎?

或者有沒有創建索引視圖而不使用左連接,但仍然返回所有行的方法?這肯定是更簡單的方法,因爲我不需要更改大量的代碼。

+0

您是否考慮過使用存儲過程? –

+0

不,但在這種情況下,這會如何幫助我?我仍然會讓桌子加速放慢速度。 – Owen

+0

爲什麼你想要返回沒有usertype的用戶? – podiluska

回答

2

在這種情況下,您可能希望做的一件事是添加一個UserType,我們稱之爲「無類型」。插入新用戶時,將其設爲默認類型。現在你可以使用內部連接而不會丟失任何行。這是一個數據管理,但在你的情況下,權衡可能是值得的。

您是檢索所有行然後過濾?有很多情況下先進行過濾,然後再進行加入。如果將篩選條件與連接放入同一查詢中,則查詢優化器通常會使用此策略。