2016-09-16 13 views
0

我有一個約10列的表。其中一列是varchar(255)。此列中的典型值長度大約爲50 - 80個字符。 這些值通常是相同的。這意味着有大約100個值可以在此列中(無空值)。該表有大約100萬個條目。在select語句中,我獲取大量的表格行。把列轉移到自己的表格對性能有好處嗎?

爲這個〜100個值創建一個自己的表並使用「主表」中的外鍵引用它們是一個好主意嗎?

我的意思是,當我爲他們創建一個新表格時,確定它需要更少的空間來保存這個值,但是對於性能來說它是不錯的嗎?

+0

我不會擔心性能(只要適當的索引。) – jarlh

+2

查找「數據庫規範化」的好文章,它會給你對這個問題的理解,這樣做的地方適當。 –

回答

0

由於性能原因,我會說'不'。如果您有一百萬條記錄加入,每個加入成本都會降低,成本也會更高。

您可以做的另一件事是使用代表這些常見文本的數字值,並使用Enum(或類似結構)將這些數字轉換爲您喜歡的語言中的文本。

+0

謝謝你的回答。是的,但我的考慮是,如果速度更快,因爲有很多相同的值,這些值會被提取,並且這可能會帶來性能上的好處,比這些連接的成本更高。 – hp58

1

將它保存在一個單獨的表中,並將它們與主表中的外鍵一起引用是很好的做法。主表也應妥善編制索引。

將它維護在單獨的表格中的優點是,如果值發生變化,則無需轉到主表(大約100萬條)並將其替換到任何位置,而是轉到新表並使在一個地方的變化。

+0

謝謝你的回答。你是對的,這是一個很大的優勢,但在我的情況下,這個值可能不會得到更新。 – hp58

+0

關於連接的性能,外鍵索引可以爲涉及主鍵和外鍵的表連接提供性能優勢 – Vikash

0

表沒有性能。查詢具有性能。

可能適用於某些查詢的性能,以改變您存儲數據的方式。對於其他查詢,這可能會損害性能。這取決於您針對數據運行的查詢。

直到使用兩種存儲方法測試和測量查詢的性能時,您才肯定知道。

對不起,這是沒有答案,但我試圖阻止猜測沒有足夠的信息的性能特點的思維模式。

+0

謝謝您的回答!我明白你的觀點。但是,我所說的查詢會提取所有列,問題是如果多次直接獲取值或通過JOIN獲取此值,性能會更好。但是可能你是對的,最好的方法是測試它並衡量性能。 – hp58

0

我有4件事你需要在這裏考慮。

  • 你會如何維護它?
    你說有很多重複的值,即使你決定將它移動到不同的表格,你會如何確定,你會最終沒有重複?你會搜索類似的條目,然後決定是否需要創建一個新的或重新使用現有的?只是你需要考慮的事情。

  • 性能插入?
    如果您沒有對該文本字段進行任何搜索, (如果您確實可能考慮全文搜索選項)。
    如果你將它移動到不同的表格中,那麼你確實爲表格添加了一個額外的索引,這意味着在插入時間它會有一個懲罰,所以,如果插入時間對你更重要,那麼你可能實際上只考慮將文本留在現在的位置。

  • 表現閱讀?
    如果您更關心閱讀時間,再次如果您不查找查詢中的這些文本,那麼添加一個外部表格將增加額外的搜索和比較以及更多工作來查找所有數據。所以,把它留在原地就好了。

  • 大小
    如果您擔心數據的大小,那麼可以,您可以將其移至不同的表格並嘗試減少重複的數據以節省空間。

相關問題