2013-08-26 69 views
3

使用timestamp without time zone類型的'made_at'列創建postgres表,ENTRIES。postgres - 估計時間戳列的索引大小

這表有兩個該列和另一列(USER_ID,外鍵)B樹索引:

btree (user_id, date_trunc('day'::text, made_at)) 

正如你所看到的,日期是在「天」截斷。以這種方式構建的索引的總大小爲130 MB - ENTRIES表中有4,000,000行。

問題:如果我要照顧時間到第二點,我該如何估計指數的大小?基本上,截斷時間戳在秒而不是一天(應該很容易做到,我希望)。

回答

2

有趣的問題!根據我的調查,他們將是相同的大小。

我的直覺告訴我,兩個索引的大小之間應該沒有差異,因爲PostgreSQL中的時間戳類型的大小是固定的(8 bytes),並且我認爲截斷函數只是將適當的最小值但我認爲我最好用一些事實來支持我的猜測。

我打滑了在Heroku的PostgreSQL自由開發數據庫,​​生成具有4M隨機時間戳表,截斷爲白天和第二值如下:

test_db=> SELECT * INTO ts_test FROM 
         (SELECT id, 
           ts, 
           date_trunc('day', ts) AS trunc_day, 
           date_trunc('second', ts) AS trunc_s 
         FROM (select generate_series(1, 4000000) AS id, 
           now() - '1 year'::interval * round(random() * 1000) AS ts) AS sub) 
         AS subq; 
SELECT 4000000 

test_db=> create index ix_day_trunc on ts_test (id, trunc_day); 
CREATE INDEX 
test_db=> create index ix_second_trunc on ts_test (id, trunc_s); 
CREATE INDEX 
test_db=> \d ts_test 
      Table "public.ts_test" 
    Column |   Type   | Modifiers 
-----------+--------------------------+----------- 
id  | integer     | 
ts  | timestamp with time zone | 
trunc_day | timestamp with time zone | 
trunc_s | timestamp with time zone | 
Indexes: 
    "ix_day_trunc" btree (id, trunc_day) 
    "ix_second_trunc" btree (id, trunc_s) 

test_db=> SELECT pg_size_pretty(pg_relation_size('ix_day_trunc')); 
      pg_size_pretty 
      ---------------- 
      120 MB 
      (1 row) 

test_db=> SELECT pg_size_pretty(pg_relation_size('ix_second_trunc')); 
      pg_size_pretty 
      ---------------- 
      120 MB 
      (1 row) 
+0

感謝,感謝您的答案和實例。這很有趣 - 顯然,我對數據庫索引是如何構建的知之甚少;我假設,由於樹中的葉節點會有更多的錯誤「桶」或「節點」,因此樹的總大小也會更大。你能否指出我的想法有什麼問題?謝謝! – alexakarpov

+0

很難弄清楚你在想什麼:)。你爲什麼假設樹中會有更多的葉節點?無論列的內容如何,​​都有相同數量的行進行索引。 – jrs

+1

夠公平=)我會試着解釋我的意思。我的直覺就是這樣 - 如果有1000條消息,並且全部都在同一天,那麼索引就沒用了 - 因爲顯然,所有記錄都有相同的時間戳 - 直到日期 - 所以索引不能幫助我們縮小個人記錄。他們都在同一個'桶';他們都留在同一棵樹節點上,不是嗎?例如,如果我們按小時計算,比我們有24個節點(假設合理的正態分佈),並且實際的行與較小的一排懸浮在一起=) – alexakarpov