2017-01-01 13 views
2

背景:Postgres的:將列的優點

我有三列,以字節爲單位以下尺寸(總共8):4(INT),2(小INT),2(小INT)。

我在這三列(按上面指定的順序)上創建了一個多列(又名複合)索引。我將執行兩種類型的選擇查詢:

  1. 範圍根據第一個4字節的列查找。第一列將單調遞增(時間戳)。
  2. Key-ed查找指定了所有這三個值的位置。

問:Postgres將這三列組合成一個8字節的bigint並處理應用程序層中的分隔有什麼好處嗎?

我在詢問關於數據庫查詢和存儲效率的觀點。

+0

對於案例#2,您會發現讀取的性能有所提高,但寫入需要更長的時間,因爲它需要更新3列而不是一個。索引本身實際上只是一個哈希集,它將佔據1列現有索引大小的3倍左右。多列索引不會增加單列搜索的性能。您需要#1的單列索引和#2的多列索引。請記住,您擁有的索引越多,寫入的速度就越慢。 –

+0

@KraangPrime:多列索引絕對可以加速單列條件 - 特別是如果它們適用於第一列。但是,即使在某些情況下尾隨列 –

+0

@a_horse_with_no_name - 對不起,我應該澄清。如果它不是主要索引,它沒有影響。如果您索引(A,B,C),並僅查詢(B)或(C)中的一個,則索引完全不用於查找。要查找使用索引,必須使用所有部分或至少主要部分產生任何影響。請參閱[此解釋](http://stackoverflow.com/a/2349824/3504007) –

回答

1

我懷疑存儲方面的任何收益將很小,並會被這樣做的侷限所抵消。是的,您可以合併,但不能對字段的子部分進行任何參照完整性檢查。即元組A可以涉及元組B,但是A和B必須是該表的整個字段的子集。這是1NF原子性要求的基礎。

現在,您可以使用函數在字段內部查詢以提取所需的信息,如果您知道自己在做什麼,甚至可以對這些函數的輸出進行索引。但是,這會佔用更多空間,否則您仍然失去參照完整性執行的可能性。

一般來說,空間是一個問題,但不在這個優化級別。除非你有極其專業化的需求,否則結合這些價值觀會帶來更多的問題。