powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
14 сообщений из 39, страница 2 из 2
MDX. Странное поведение CM.
    #37267099
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mihami,

а есть ли возможность упростить вопрос, перейдя к конкретному MDX запросу для Adventure Works?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267134
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un Tues,

вот мои сеты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE hidden DYNAMIC SET CURRENTCUBE.[ppA] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 80 ,[Measures].[Amount]);   

CREATE hidden DYNAMIC SET CURRENTCUBE.[ppB] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 90 ,[Measures].[Amount])-ppA;

CREATE hidden DYNAMIC SET CURRENTCUBE.[mA]
 AS  tail(ppA);  
 
CREATE hidden DYNAMIC SET CURRENTCUBE.[mB]
 AS  tail(ppB); 

CREATE MEMBER CURRENTCUBE.[Measures].[ABC реализация] AS 
iif(ISEMPTY([Measures].[Amount]),null,
   iif([Measures].[Amount]>sum(mA,[Measures].[Amount]),"A",
      iif([Measures].[Amount]>sum(mB,[Measures].[Amount]),"B","C"))), 
VISIBLE =  1 ;
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267185
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все-таки. Если перейти к Adventure Works, сразу станет ясно, в вычислениях дело или в чем-то другом.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MDX. Странное поведение CM.
    #38018166
Добрый день! Реализовал ABC-анализ по аналогии с данным примером и столкнулся с следующей ситуацией: Динамические сеты используемые в расчете ABC-анализа стали значительно тормозить время создания или открытия других отчетов. При этом если исключить DYNAMIC SET на обычный, то все тормоза пропадают, но ABC-анализ не отрабатывает с фильтрацией по иерархии товаров. Кто нибудь сталкивался с данной задачей?!?! Если да то подскажите решение. Заранее спасибо!!!

mihamiВобщем мое решение для БОООЛЬШИХ кубов:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE hidden DYNAMIC SET CURRENTCUBE.[ppA] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]),80,[Measures].[Amount]);   

CREATE hidden DYNAMIC SET CURRENTCUBE.[ppB] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]),90,[Measures].[Amount])-ppA;

CREATE hidden DYNAMIC SET CURRENTCUBE.[mA]
 AS  tail(ppA);  
 
CREATE hidden DYNAMIC SET CURRENTCUBE.[mB]
 AS  tail(ppB); 

CREATE MEMBER CURRENTCUBE.[Measures].[ABC реализация] AS 
iif(ISEMPTY([Measures].[Amount]),null,
   iif([Measures].[Amount]>sum(mA,[Measures].[Amount]),"A",
      iif([Measures].[Amount]>sum(mB,[Measures].[Amount]),"B","C"))), 
VISIBLE = 1;



Причем если сеты сравнивать через MIN
Код: sql
1.
iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",


то время обработки вырастает с 1.9 сек до 2.1 сек по сравнению с SUM (тестил на ХД 160 Мб)

Владимир Штепа предлагал использовать через RANK без динамических сетов
Код: sql
1.
iif(rank(Product.CurrentMember, toppercent([Product].[Brand Name].members, 80,([Store].[All Stores].[USA].[WA], [Measures].CurrentMember))) > 0, "A", 


и должен с ним не согласится, т.к. время обработки выростает с 1.9 до 11.3 сек.

ИТОГО

когда я воодрузил решение на ХД 107 Гб то получил время обработки запроса 3.4 сек!!!!
Господа это очень хороший результат!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MDX. Странное поведение CM.
    #39423783
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Проблема торможения других запросов решается через ХАК:
http://rubicon.azurewebsites.net/2014/08/05/abc-анализ-в-sql-server-analysis-services-практическое-руководс/

Велосипед не мой, так как нет желания переписывать RegexIsMatch, то сделано через IsLike. (В AS влит стандартный ASSP):

Код: sql
1.
2.
3.
4.
5.
6.
CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[B,15%]
 AS 
IIF(ASSP.CurrentCommandIsDiscover(), { },
IIF(ASSP.IsLike(ASSP.GetCurrentCommand(), "%ABC%"),
    TopPercent([Товары].[Товар].MEMBERS, 95, [Measures].[СуммаРеализации])
, { }));       




Если у кого есть ASSP с вышеназванной функцией, или объявится автор - прошу его выложить.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423785
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос с ABC не закрыт:

Предложенное решение работает с текущими фильтрами, но без учёта столбцов, для разных объектов учёта(Иван, Петя) может быть разный ранг и разный ABC. (Иван хорошо продал яблоко - для него ранг 1 по яблоку, Петя продал персик - для него ранг 1 по персику).

Так как я только начал разбираться прошу сообщество о помощи для решения такой тривиальной для бизнеса задачи, как ABC-анализ в разрезе объектов учёта.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423872
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

Может разочарую но ни в этой теме, ни в приведённой ссылке совсем не ABC анализ а однофакторный TopCount или TopSum, поэтому для начала рекомендую разобраться с его теоретической бизнес-сутью и потом приступать к поиску технической реализации (которая к стати на этом форуме уже приводилась).
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423884
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

Вот. Вы умными словами сказали что я и описал в прошлом сообщении. Приемлемого по скорости ABC не нашёл. Буду благодарен, если поможете в этом.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423966
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

концептуально (и по быстрому скопированно от сюда 18968217 ) вот так можно реализовать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
with set a as order(product.product.children,[Internet Sales Amount],bdesc)--отсортированный список продуктов
member b as rank(product.product.currentmember,a)--ранг продукта в номенклатуре
member c as sum(head(a,b),[Internet Sales Amount])--нарастающий итог
member d as b/a.count,format="percent"---процент от количества номенклатуры 
member e as c/sum(a,[Internet Sales Amount]),format="percent"--процент кумулятивной суммы в общих продажах
member f as case when d<=0.2 and e<=0.5 then'A'when d<=0.6 and e<=0.85 then'B'else'C'end---АБЦ классификация
select{[Internet Sales Amount],b,c,d,e,f}on 0,a on 1from[Adventure Works]


но на самом деле зависит от того что ты подразумеваешь под столбцами, даже если встраиваешь в меры на стороне куба то по идее считается в текущем (остальное null) контексте (from/where currentmember), остальное уже от клиентского приложения зависит - как оно формирует запрос..
в принципе у меня на наборах из тысяч продуктов/клиентов (или что там другое под анализ попадает) отрабатывает за секунды (хотя и очевидно что в cell-by-cell режиме)..
вечером вернусь и если время останется может что-то перепишу попроизводительней (напр. там сразу видно что count и второе sum можно кэшировать через промежуточное [All].., к set для сжатия лучше применить nonempty если продаж по многим продуктам нет.. и пр.)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424059
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,
Пожоже тормозит подсчёт C. Не дождался
правильно ли я понимаю, что при расчёте RunningSum в C, для каждого tuple из A суммируются все элементы от первого до текущего? Получается O^3 алгоритм?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424227
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

Так указано-же на nonempty и кеширование (Total/Sum и Count)..
вот немного оптимизированный запрос - разница в скорости - последний выполняется за долю (0.0024) или четверть процента (0.24%) от начального
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with set a as order(nonempty(product.product.children,[Internet Sales Amount]),[Internet Sales Amount],bdesc)--отсортированный список продуктов
member b as a.count--количество продуктов в наборе
member c as(product.product.parent,b)--кеширование количества
member d as rank(product.product.currentmember,a)--ранг продукта в номенклатуре
member e as sum(head(a,d),[Internet Sales Amount])--нарастающий итог
member f as d/c,format="percent"--процент от количества номенклатуры 
member g as sum(a,[Internet Sales Amount])--общий итог
member h as (product.product.parent,g)--кэширование общего итога
member i as e/h,format="percent"--процент кумулятивной суммы в общих продажах
member j as case when f<=0.2and i<=0.5then'A'when f<=0.6and i<=0.85then'B'else'C'end---ABC классификация
select{[Internet Sales Amount],d,e,f,i,j}on 0,a on 1from[Adventure Works]--конечный запрос



с лева время на выполнение первичного, с права новый запрос



хотя доля прироста производительности за счёт кэширования в данном случае не такая высокая, в основном играет роль nonempty
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424233
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное можно ещё нарастающий итог / кумулятивную сумму как-то оптимизировать - видел много где мелькает в блогах, но есть-ли подобное для такого отсортированного набора другой вопрос.

причём это время выполнения у меня на лаптопе (правда с SSD), не сервере может побыстрее будет (хотя тестовые кубы маленькие - всё равно всё в памяти и нагрузка на CPU при таких малых измерениях не такая большая)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424331
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isyvikkiv,
....
правильно ли я понимаю, что при расчёте RunningSum в C, для каждого tuple из A суммируются все элементы от первого до текущего? Получается O^3 алгоритм?Да, это суть нарастающего итога к сожалению, один из гвоздей в колесо (rank тоже не самая резвая функция)..
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424408
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

Благодарю за развёрнутый ответ!
Эксперименты показали, что CREATE DYNAMIC SET на сервере и WITH SET.. в запросе это вещи разные, завтра продолжу разбираться.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]