2010-03-06 92 views
0

注意:正在使用m4,所以擴展了前綴字符串(m4是類似於c預處理器的宏預處理器)。Postgres散列用戶定義類型

我喜歡的類型:

CREATE TYPE UrlPair AS (              
    HostName  varchar(_LIMIT_HOSTNAME),        
    ScriptName  varchar(_LIMIT_SCRIPTNAME)        
); 

CREATE TABLE SymbolTable_UrlPair (
    Symbol   _BIG_SYMBOL_SERIAL_TYPE  PRIMARY KEY, 
    UrlPair   UrlPair      
); 

同時使用指數

CREATE INDEX SymbolTable_UrlPair_UrlPair 
    ON SymbolTable_UrlPair USING hash (UrlPair); 

給出:

psql:script:32: ERROR: data type urlpair has no default operator class 
for access method "hash" 

HINT: You must specify an operator class for the index or define a default 
operator class for the data type. 

問題

理想情況下,我希望引擎能夠協調字符串並將其用於哈希。但是,我不挑剔。有人可以向我展示爲訪問方法散列聲明這個「運算符類」的語法。

我會期望用戶定義類型的一些默認哈希行爲。我真的會主張保持這種類型 - 即我不想擴展它,因爲我可能會定義一些更詳細的UDT。

回答

1

散列和散列索引是兩個不同的東西。哈希索引不支持多列索引,這可能是問題,您的類型UrlPair是多值。

Btree索引有什麼問題?有什麼問題需要解決?

+0

代表超大型數據庫中的URL。對於字符串AFAIK http://www.postgresql.org/docs/7.3/static/sql-createindex.html,線性散列索引優於B樹。該頁面指出可以指定一個'func_name',它用於返回可以被索引的值。我正在使用這將允許UDT返回一個可以散列的實體(在我的情況下是URL的連接)。 – 2010-03-06 16:56:59

+0

唔切換到B-tree工作。我想我會堅持使用B樹,因爲我可能會在主機名上使用基於範圍的掃描。不過,我仍然對訪問方法的語法感興趣。 – 2010-03-06 17:01:49

+1

@hassan:你真的沒有使用PostgreSQL 7.3,我希望?如果是這樣,你首先要做的是獲得一個受支持的,非古老的版本。並且請注意,在大多數情況下,在今天的PostgreSQL中,btree索引的性能與散列一樣好或者更好。 – 2010-03-07 14:00:28