2013-01-08 77 views
3

我有一個表矢量類型位(2000)。數據庫引擎如何處理操作超過此值?它是否簡單地分成32位塊(或分別爲64),然後分別比較每個塊,最後只是將結果連接在一起?還是隻處理兩個字符串?postgres如何處理位數據類型?

我的觀點是預測,哪種用例會更快。我得到了一個鍵值數據(user-item)。

userID | itemID 
U1  | I1 
U1  | Ix 
Un  | Ij 

對於i要計算的n個最近鄰居列表(使用jaccard index,例如)每個用戶。

select my_jaccard(select itemID from table where userID=U1,select itemID from table where userID=U2) 

我的解決方案 - I解析的輸入數據到用戶矢量的表,其中所述載體是類型位(2000)與1對錶示所述特定項目的位置。

userID | vector 
U1  | 00.......01 
U1  | 0..1.....00 
Un  | 00..1..1..0 

在此表中我根本

select vector1&vector2 

的一點是,每個用戶具有至多隻有10個記錄的所有項目,即,矢量具有最大的10個活動位。我認爲,解析整個bitvector只是爲了找到活動位需要更多的計算資源,而不是簡單地將user1的10個值和user2的10個值與另一個的值進行比較。

使用位數很少設置爲1的長位矢量更快嗎?還是更好地將原始值用作集合並將兩個集合相比較? (一組具有最大的10個項目)

我同時使用PSQL V8.2和v9.x的

+0

爲什麼過時的V8引擎。 2?你需要在v9.x中指定'x'來聲明一個Postgres版本。 –

+0

@ErwinBrandstetter:thx,計算是否依賴於版本?我使用8.2,因爲它是一個生產實例,我無法更改。 v9.x可以是任何人,因爲這是一個測試實例,我可以將其更改爲這種情況下更好的一種。如果答案取決於版本,我需要知道差異,所以我們假設所有版本從8-9.x – ulkas

回答

5

位操作對位類型的,呃,位操作進行內部處理。這裏是「和」的代碼做什麼,例如:

p1 = VARBITS(arg1); 
p2 = VARBITS(arg2); 
r = VARBITS(result); 
for (i = 0; i < VARBITBYTES(arg1); i++) 
    *r++ = *p1++ & *p2++; 

(所以它實際上是8位數據塊。)

所以我覺得這應該是相當快的。

3

源代碼似乎逐字節比較。搜索the PostgreSQL source code以查找「bit_and」和「bit_or」函數。 (似乎沒有成爲一個自然的方式讓我直接鏈接到一個函數)。

摘錄BIT_AND的(),系1205年至1209年varbit.c

p1 = VARBITS(arg1); 
p2 = VARBITS(arg2); 
r = VARBITS(result); 
for (i = 0; i < VARBITBYTES(arg1); i++) 
    *r++ = *p1++ & *p2++; 
+0

感謝您的評論,我標記下面的答案接受,你們兩個人提供了相同的信息我需要,但彼得做了6秒更快:) – ulkas

+1

6秒?我怪責康卡斯特。 –