2016-02-26 4 views
0

Я знаю, что mondrian преобразует запросы MDX в реляционные запросы и возвращает результат. Но есть ли какие-либо подробности об этом процессе?Что происходит во время запроса с использованием mondrian?

Я использую образец куба HR. Вот MDX:

WITH 
SET [~ROWS] AS 
    TopCount({[Time].[Time].[Month].Members}, 3, [Measures].[Org Salary]) 
SELECT 
NON EMPTY {[Measures].[Org Salary]} ON COLUMNS, 
NON EMPTY [~ROWS] ON ROWS 
FROM [HR] 

И это SQL, сгенерированный MDX. Я считаю, это в журнале:

select 
    "time_by_day"."the_year" as "c0", 
    "time_by_day"."quarter" as "c1", 
    "time_by_day"."the_month" as "c2", 
    "time_by_day"."month_of_year" as "c3", 
    sum("salary"."salary_paid") as "c4" 
from 
    "salary" as "salary", 
    "time_by_day" as "time_by_day" 
where 
    "time_by_day"."the_year" = 1997 
and 
    "salary"."pay_date" = "time_by_day"."the_date" 
group by 
    "time_by_day"."the_year", 
    "time_by_day"."quarter", 
    "time_by_day"."the_month", 
    "time_by_day"."month_of_year" 
order by 
    CASE WHEN sum("salary"."salary_paid") IS NULL THEN 1 ELSE 0 END, sum("salary"."salary_paid") DESC, 
    CASE WHEN "time_by_day"."the_year" IS NULL THEN 1 ELSE 0 END, "time_by_day"."the_year" ASC, 
    CASE WHEN "time_by_day"."quarter" IS NULL THEN 1 ELSE 0 END, "time_by_day"."quarter" ASC, 
    CASE WHEN "time_by_day"."the_month" IS NULL THEN 1 ELSE 0 END, "time_by_day"."the_month" ASC, 
    CASE WHEN "time_by_day"."month_of_year" IS NULL THEN 1 ELSE 0 END, "time_by_day"."month_of_year" ASC 

меняю верхний 3 до топ-10, и я получил тот же SQL. И SQL не имеет ничего подобного «limit».

Так что мне интересно, что происходит во время запроса? Я искал и не получил никакой полезной информации. Может ли кто-нибудь помочь?

спасибо.

Longxing

ответ

1

Если вы посмотрите на Мондриана журнала вы увидите инфокоммуникационных об этом, как:

  • SqlMemberSource.getMemberChildren
  • SqlTupleReader.readTuples
  • SqlStatisticsProvider.getColumnCardinality
  • сегмента. грузы

Mondrian читает горшки и загружает сегменты из SQL, позволяя базе данных выполнять некоторые вычисления и делать остальное внутренне. Основываясь на вашем MDX, схеме и настройке, он будет выполнять различные задачи для базы данных и внутренних вычислений, пытаясь решить ее в оптимальной производительности и памяти. Принимая во внимание, что он должен иметь наилучший возможный кеш для будущих запросов.

+0

Вы имеете в виду, что MDX может иметь другое исполнение в Mondrian на основе MDX, схемы и настройки. Например, Mondrian может получить все данные из базы данных и кэшировать его и применить topCount в Mondrian или просто вычислить в базе данных. Я прав? –

+0

@ LongxingWei Да, вот что я имел в виду. – bolav

+0

Я нахожу configure в mondrian.properties. mondrian.rolap.aggregates.optimizePredicates = верно. Что помогает. благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^