0

私はたくさんのSQLデータベースを持っています。これらは主に行主キーとしてランダムに生成されたGuidを持っています。私は、与えられたGuid(型情報なし)に関連するテーブルと行のデータを見つける方法が欲しいです。多くのSQLデータベースとテーブルにわたって、特定のGuidに関連付けられた行を見つけるための速い方法

私は各テーブルのBloomフィルタを設定し、どこかにキャッシュすることを検討していました。私は最初にフィルタに対してGuidをテストした後、データベースまたはキャッシュにデータを問い合わせます(または偽陽性の場合)。しかし、私は以前に彼らと仕事をしていないので、彼らのパフォーマンスの特性がどのようなものか、そして私の問題に対する効果的な解決策であるかどうかはわかりません。

データベースの特性:

  • 〜100の表は、のどちらかを選択します。いくつかは他よりもはるかに選択される可能性が高い。

  • バグの後で手動でクリーンアップしない限り、行が削除されないため、ブルームフィルタから情報を削除できないと心配していません。

  • データ以外の構造!すべてが1つのサーバーに収まります。

これは調査する価値のある解決策ですか?より一般的なルックアップ構造をキャッシュすることを強くお勧めしますか?私がBloomに行くなら、Guidsは非常に独立した入力であるので、ハッシュ関数へのショートカットはありますか?

+0

システムテーブルの外部キーの依存関係を調べるよりも、アプリケーションコードにBloomフィルタを実装する方がいいですか? (GUIDかどうかにかかわらず、キーを使用する毎に外部キー参照が行われるという保証はありません) –

+0

'システムテーブル'とは、クエリできるデータベースメタデータがあることを意味しますか?私はこれらのテーブルの周りに私の道を知らないので、私を啓発してください。気になるデータのすべてのGUIDが外部キーに表示される可能性があります。 – sh54

+0

すべてのSQLデータベースには、少なくとも1つのメタデータを照会する方法があります。 「標準的な」方法は、INFORMATION_SCHEMAビューを使用することです。しかし、これらは通常システム・テーブルの上に構築されたビューなので、プラットフォームによっては、基礎となるテーブルを直接照会することもできます。 (使用しているプラ​​ットフォームはわかりませんが、質問にタグを付けることができます) –

答えて

0

プラットフォームのヘルプで「INFORMATION_SCHEMA」または「システムテーブル」を検索してください。私が知る限り、すべてのSQL dbmsには、メタデータをクエリするための少なくとも1つの方法があります。 「標準的な」方法は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

?あなたはあなたのデータベースがデータに照らされていることを示しています。したがって、ブルームフィルターのコンパクトさは本当に必要ですか?ブルームフィルタでは偽陽性が起こる可能性があるので、一致を確認するために1つ以上のテーブルでインデックスルックアップを実行する必要があります(他のインデックスルックアップに比べて実際のパフォーマンス上の利点はありません)。挿入操作中にBloomフィルタを維持する場合は、通常のインデックスを通常のテーブルに簡単に維持することもできます。

なぜこの情報を維持するために1つ以上の単純なテーブルを作成しないのですか?プライマリキーを形成する2つの列(Guid-ValueとTable-ID)を持つテーブルを作成し、これをインデックスとして使用することもできます。

関連する問題