Что ж, с новой информацией о том, что это плотный массив однородных числовых (двойных) значений, и запросы важны (то есть я не буду обращать внимание на денормализацию в BLOB-объекты / XML и использование специальные UDF), я предлагаю следующее:
Разделить каждый результат на несколько записей, где каждая запись имеет вид:
ID, SEGMENT, IDx ... // where x is [0, q]
Значение q
является произвольным, но его следует выбирать в зависимости от конкретной реализации базы данных (например, попытаться вписаться в размер записи 8k в SQL Server) из соображений производительности / эффективности.
Каждый результат будет затем разбит на записи так, что SEGMENT
относится к сегменту. То есть «абсолютный индекс» данной функции равен n = SEGMENT * q + x
, а функция n
будет найдена в записи, где SEGMENT = n / q
. Из этого следует, что первичный ключ - (ID, SEGMENT)
.
Таким образом, запрос по-прежнему прост - единственным изменением является преобразование в / из сегмента - с единственным дополнительным требованием SEGMENT
(этот столбец также может участвовать в индексе).
(Отдельная таблица может использоваться для сопоставления объектов с SEGMENT/x
или другим способом. Таким образом, она аналогична модели EAV.)
Таким образом, несмотря на то, что в некоторых отношениях он похож на полностью нормированную форму, он использует преимущества упакованной / однородной / статической особенности исходной матрицы для значительного сокращения количества записей - в то время как 2 миллиона записей - возможно небольшая таблица и 20 миллионов записей - это всего лишь таблица среднего размера, 200 миллионов записей (результат 200 чипов x 1 миллион функций на чип, если каждая функция приводит к записи) начинает устрашать. При той же сложности, q
из 200 уменьшит количество записей до 10 миллионов. (Каждая сжатая запись также намного более эффективна с точки зрения соотношения данных / структуры.)
Удачного кодирования.
Хотя вышеизложенное является одним из предварительных предположений «что если» с моей стороны, я бы рекомендовал более подробно изучить проблему - в частности, точные требуемые схемы доступа к данным. Я не уверен, что это «типичное» использование стандартной СУБД, и СУБД может даже не быть хорошим способом решения этой проблемы.