Быстрый способ найти строку, связанную с данным Guid, во многих базах данных и таблицах SQL - PullRequest
0 голосов
/ 07 июля 2011

У меня есть несколько баз данных SQL, каждая из которых содержит множество таблиц.Они преимущественно имеют случайно сгенерированные направляющие как первичные ключи строк.Я хотел бы найти способ найти таблицу и данные строки, связанные с данным Guid (без информации о типе).

Поэтому я подумывал о настройке фильтра Блума для каждой таблицы и где-то его кешировать.Сначала я протестировал бы Guid по отношению к фильтру, а затем запросил в базе данных или кеше данные (или ложный результат).Однако я никогда не работал с ними раньше и поэтому не знаю, каковы их характеристики производительности, и могут ли они стать эффективным решением моей проблемы.

Характеристики базы данных:

  • ~ 100 таблиц на выбор.Некоторые из них гораздо более вероятны, чем другие.

  • Ни одна строка не удаляется (если только ручная очистка после ошибки), поэтому меня не беспокоит невозможность удаления информации изфильтр Блума.

  • Больше структуры, чем данных!Все умещается на одном сервере.

Стоит ли исследовать это решение?Мне лучше придерживаться кэширования более обычных структур поиска?Если я перейду к Блуму, есть ли какие-нибудь ярлыки для функций хеширования, учитывая, что направляющие являются очень независимым входом?

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Зачем использовать фильтр Блума?Вы указали, что ваша база данных легка в данных, поэтому действительно ли необходима компактность фильтра Блума?Поскольку ложные срабатывания возможны с фильтрами Блума, вам нужно будет выполнить поиск индекса в одной или нескольких таблицах, чтобы подтвердить совпадение (поэтому нет никакого реального выигрыша в производительности по сравнению с любым другим поиском индекса).Если вы собираетесь поддерживать фильтр Блума во время операций вставки, вы также можете легко поддерживать обычный индекс в общей таблице.

Так почему бы не создать одну или несколько простых таблиц для поддержки этой информации?Вы можете иметь таблицу с 2 столбцами (Guid-Value и Table-ID), которая также образует первичный ключ, и использовать ее в качестве индекса.

0 голосов
/ 07 июля 2011

Поищите в справке вашей платформы "INFORMATION_SCHEMA" или "системные таблицы".Насколько я знаю, у каждой базы данных SQL есть по крайней мере один способ для запроса метаданных.«Стандартным» способом является использование представлений INFORMATION_SCHEMA, но их содержимое варьируется среди поставщиков dbms.

В Информационная схема PostgreSQL , этот запрос покажет вам все имена таблиц и столбцов, которые имеют сторонниеключевые ограничения, а также их целевые таблицы и имена столбцов.

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

...