Я реализовал несколько систем, которые имитировали работу кубов OLAP, и вот несколько вещей, которые мы сделали, чтобы заставить их работать.
1) Основные данные содержались в n-мерном массиве, все в памяти, и все ключи были реализованы через иерархии указателей на базовый массив. Таким образом, мы можем иметь несколько разных наборов ключей для одних и тех же данных. Данные в массиве были эквивалентны таблице фактов, часто она содержала только пару частей данных, в одном случае это была цена и количество проданных товаров.
2) Базовый массив часто был разреженным, поэтому, как только он был создан, мы использовали для удаления все пустые ячейки для экономии памяти - много арифметики с жестким указателем, но это работало.
3) Поскольку у нас были иерархии ключей, мы могли довольно легко написать подпрограммы для упрощения иерархии. Например, мы будем получать доступ к данным за год, просматривая ключи месяцев, которые, в свою очередь, сопоставляются с днями и / или неделями. На каждом уровне мы собирали данные как часть построения куба - вычисления выполнялись намного быстрее.
4) Мы не реализовали никакой язык запросов, но мы поддерживали детализацию по всем осям (до 7 в наших самых больших кубах), и это было напрямую связано с пользовательским интерфейсом, который понравился пользователям.
5) Мы реализовали ядро в C ++, но сейчас я считаю, что C # может быть достаточно быстрым, но я бы беспокоился о том, как реализовать разреженные массивы.
Надеюсь, это поможет, звучит интересно.