2011-07-07 20 views
0

我有很多SQL數據庫,每個用大量的表相關的行。這些主要具有隨機生成的Guids作爲行主鍵。我想要一種方法來查找與給定的Guid關聯的表格和行數據(沒有類型信息)。快速的方法來找到一個給定的Guid跨多個SQL數據庫和表

所以我正在考慮設立爲每個表布隆過濾器和它緩存起來。我會首先測試Guid對過濾器,然後查詢數據庫或緩存中的數據(或假陽性)。但是我從來沒有和他們合作過,所以不知道他們的表現特徵是什麼樣子,以及他們是否會成爲我的問題的有效解決方案。

數據庫特點:

  • 〜100臺之間進行選擇。有些人比其他人更有可能被選中。

  • 沒有行被徹底刪除(除非錯誤後手動清理),所以我不擔心不能夠從布隆過濾器中刪除信息。

  • 更多的結構比數據!一切都適合一臺服務器。

這是一個值得研究的解決方案嗎?我是否更願意緩存更傳統的查找結構?如果我去布盧姆,鑑於Guids是非常獨立的輸入,是否有任何散列函數的捷徑?

+0

你是說你寧願在應用程序代碼中實現Bloom filter而不是在系統表中查找外鍵依賴關係? (當然,並不保證每次使用某個鍵或GUID都是通過外鍵引用發生的,但仍然是這樣。) –

+0

「系統表」是否意味着我可以查詢數據庫元數據?我不知道我在這些桌子旁邊的方式,所以請賜教。很有可能我關心的每個GUID引用的數據片段都出現在外鍵中。 – sh54

+0

每個SQL數據庫都至少有一種查詢元數據的方法。 「標準」方式是使用INFORMATION_SCHEMA視圖。但是,由於這些通常是建立在系統表之上的視圖,所以有些平臺還允許您直接查詢基礎表。 (不知道你在使用什麼平臺,但你可能想用它來標記你的問題。) –

回答

0

搜索平臺對「INFORMATION_SCHEMA」或「系統表」的幫助。據我所知,每個SQL dbms至少有一種方法可以查詢元數據。 「標準」方式是使用INFORMATION_SCHEMA視圖,但其內容因dbms供應商而異。

PostgreSQL's information schema中,此查詢將向您顯示具有外鍵約束的所有表名和列名,以及它們的目標表名和列名。

select kc2.table_name as fk_table_name, kc2.column_name as fk_column_name, 
     kc1.table_name as ref_table_name, kc1.column_name as ref_column_name 
from INFORMATION_SCHEMA.referential_constraints rc 
inner join INFORMATION_SCHEMA.key_column_usage kc1 
     on rc.constraint_catalog = kc1.constraint_catalog 
     and rc.constraint_schema = kc1.constraint_schema 
     and rc.unique_constraint_name = kc1.constraint_name 
inner join INFORMATION_SCHEMA.key_column_usage kc2 
     on rc.constraint_catalog = kc1.constraint_catalog 
     and rc.constraint_schema = kc1.constraint_schema 
     and rc.constraint_name = kc2.constraint_name 
order by kc2.table_name, kc2.column_name 

SQL Server Information Schema Views

0

爲何使用布隆過濾器?您指出您的數據庫對數據較爲輕鬆,因此布隆過濾器的緊湊性確實非常必要?由於布隆過濾器可能會出現誤報,因此您需要經過努力在一個或多個表中執行索引查找以確認匹配(因此,與其他索引查找相比,沒有真正的性能優勢)。如果要在插入操作期間維護布隆過濾器,則可以在普通表中輕鬆維護常規索引。

那麼,爲什麼不創建一個或多個簡單的表來維護這些信息?您可以創建一個包含兩列(Guid-Value和Table-ID)的表格,該表格還可以構成主鍵,並將其用作索引。

相關問題