Внедрение и индексация пользовательских полей в базе данных SQL

Мне нужно хранить большую таблицу (несколько миллионов или строк), которая содержит большое количество пользовательских полей (не известно во время компиляции, но, вероятно, около 20-40 пользовательских полей). Для меня очень важно (с точки зрения производительности) иметь возможность запрашивать данные на основе этих настраиваемых полей:Выберите строки, в которых этот атрибут имеет это значение, этот атрибут является этим значением и т. Д. ", Каждый запрос содержит от 20 до 30 предложений WHERE.

Мои идеи пока:

Меняйте схему базы данных каждый раз, когда вводится новое пользовательское поле. Держите каждое пользовательское поле в виде столбца в таблице. Добавить и поддерживать индексы для каждого пользовательского столбца. Как правильно построить эти индексы является большой проблемой, так как я неНе знаю, какие атрибуты (столбцы) будут использоваться в запросах WHERE.

Сохраните пользовательские поля в виде столбца типа XML. Как я понимаю из SQL2005, я могу запрашивать внутри XML в столбцах типа XML. Не так уверен насчет производительности, хотя.

Значение атрибута сущности , Это то, что я использую сейчас, но этоЭто боль.

Какие-либо предложения?

Изменить: некоторые разъяснения по моим требованиям. У меня есть таблица, 40-50 миллионов строк (скажем) идентификационных номеров и различные атрибуты, связанные с этими идентификаторами.

Позволять'скажем, 20 миллионов из них имеютCustomAttribute1" равен 2, то 5 миллионов имеютCustomAttribute2" равно "Да" и 3 миллиона имеютCustomAttribute20" равно 'Нет»

I need a FAST method of returning all IDs where:
     1. CustomAttribute1  = 2
     2. CustomAttribute2  = 'Yes'
     3. CustomAttribute4  = null
     4. CustomAttribute20  != 'No'  
  etc...

Мы реализовали это как EAV: запрос на выбор - это кошмар для реализации и обслуживания, для возврата результата требуется много времени, и, что самое неприятное, БД масштабируется до огромных размеров даже для небольших объемов данных, что странно, поскольку EAV по сути, нормализует данные, но я предполагаю, что все индексы занимают много места.

Ответы на вопрос(2)

Ваш ответ на вопрос