Является ли Mondrian / OLAP неправильным инструментом для объединения больших измерений / наборов?

Резюме: большинство примеров MDX-объединений, которые я видел, включают объединение относительно небольших наборов, скажем, с десятками или сотнями элементов в каждом. Но я Я также хочу попробовать объединить (в частности, «непустое объединение») наборы, в каждом из которых есть тысячи или десятки тысяч элементов, и пока это не работает хорошо. Мне интересно, можно ли это заставить работать, или если мне, возможно, нужно рассмотреть возможность использования чего-то другого, кроме Mondrian / OLAP.

Чтобы быть конкретным, у меня есть куб, который записывает взаимодействия между фирмами (n = 7000) и клиентами (n = 27000). В настоящее время и Фирма, и Клиент полностью плоские иерархии; есть уровень «Все» и уровень отдельной компании, без каких-либо промежуточных уровней. Есть центральная таблица фактов и отдельные таблицы измерений для фирм и для клиентов.

Мои пользователи, по крайней мере, похоже, хотят получить сводные отчеты по этим линиям, объединяющие все непустые взаимодействия между Фирмами и Clie nts:

select
  [Measures].[Amount] on columns,
  NonEmptyCrossJoin([Firm].Children,
                      [Client].Children) on rows
from MyCube

Но этот запрос и его варианты не работают в моей тестовой установке Mondrian. Либо я получаю OutOfMemoryException (в куче Java 2 ГБ), либо Java, кажется, проводит невероятно много времени в mondrian.rolap.RolapResult $ AxisMember.mergeTuple (TupleCursor). (Я могу предоставить более полную трассировку стека, если это поможет.Под «невозможно долго» я ​​подразумеваю, что Java будет продолжать работать над запросом в течение многих часов, прежде чем я откажусь от него.

Изначально я ожидал, что вышеуказанный запрос будет работать нормально, потому что концептуально это могло быть выполнено несколько эффективно, просто выполняя SQL-запрос в следующих строках:

select Firm, Client, Sum(Amount) as n
from fact, firm, client
where fact.firmid = firm.firmid and fact.clientid = client.clientid
group by Firm, Client

(Фактически, если я выполню что-то вроде этого непосредственно в MySql для выполнения требуется не более 15 секунд.)

Но, судя по журналам отладки, Мондриан, похоже, не пытается эту оптимизацию. Вместо этого он, похоже, выполняет внутреннее соединение, и это в конечном итоге оказывается особенно медленным. Я установил mondrian.native.crossjoin.enable = true в моем mondrian.properties, но это не похоже на один из типов соединения, которые Мондриан может «сделать родным». (Если я включаю mondrian.native.unsupported.alert = ERROR, я получаю соответствующее исключение.)

Мне остается только гадать, нужно ли мне запретить моим пользователям попытки соединения на таких больших размерах / наборах, или Мондриан возможно, это не тот инструмент, который я ищу здесь. Но может я просто что-то не так делаю.

6
задан Chris 19 November 2011 в 00:44
поделиться