powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / AS2005. Где ошибка в MDX?
11 сообщений из 11, страница 1 из 1
AS2005. Где ошибка в MDX?
    #33473120
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой запрос выполняется без проблем.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with 

member measures.mymember as 
count(
	nonempty(
		{[Customer].[Customer].[Customer].MEMBERS} *
		{[Date].[Date].[Date].MEMBERS} *
		{[Product].[Product].[Product].MEMBERS} *
		{[Measures].[Internet Transaction Count], [Measures].[Internet Order Count], [Measures].[Customer Count]}
	)
)

select {measures.mymember} on  0 
from [Adventure Works]

а этот возвращает #Error

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with 

member measures.mymember as 
count(
	nonempty(
		{[Customer].[Customer].[Customer].MEMBERS} *
		{[Date].[Date].[Date].MEMBERS} *
		{[Product].[Product].[Product].MEMBERS}
	)
)

select {measures.mymember} on  0 
from [Adventure Works]

Почему?

p.s.

Рассмотрение под лупой указывает на UInt32.max :-( хотя эксперименты проводятся на 64-битной машине.


AS2005CellOrdinal 0
VALUE #Error Der Ausdruck enthält eine Funktion, die nicht für eine Menge mit mehr als 4.294.967.296 Tupeln ausgeführt werden kann.
FORMATTED_VALUE #Error Der Ausdruck enthält eine Funktion, die nicht für eine Menge mit mehr als 4.294.967.296 Tupeln ausgeführt werden kann.
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33474040
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маньяк хватит ошибки на немецком слать :-).......


А если так прикинуть то сколько ячеек вернет это перемножение?
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33474641
Беляев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то смахивает на то, будто бы возникает бесконечная рекурсия.
NonEmpty ведь без Measure не имеет смысл, а в данном случае (в случае ошибки) Measures.CurrentMember - это и есть сам measures.mymember

Владислав Беляев
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33475497
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо г-ну Беляеву - действительно current measure это и есть calculated measure и казалось бы должна быть бесконечная рекурсия. Но AS2005 умеет бороться с такой рекурсией когда цикл рекурсии всего одно звено. Ошибка из-за другого - поскольку есть вычисления наложенные поверх Non Empty, то QO приходится итерировать по всему сету, а там действительно много туплов. Эту ошибку я вставил как предохранитель, чтобы не сидели пользователи часами и ждали пока проитерирует по такому количеству туплов. А вот не было бы вычисления, QO этот бы запрос разделал бы быстро и легко.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33475544
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда как объяснить, что запрос с меньшим сетом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
with 

member measures.mymember as 
count(
	nonempty(
		{[Customer].[Customer].[Customer].MEMBERS} *		{[Product].[Product].[Product].MEMBERS}	)
)

select {measures.mymember} on  0 
from [Adventure Works]

уводит сервер в тяжкие раздумия?
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33475610
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я как раз именно это и обьяснил в предыдущем посте !

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33475658
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. сколько в этом сете туплов. А для каждого, придется повторить это же самое вычисление, т.к. current measure не поменялось. Достаточно посмотреть на perfmon counter или на trace на количество NON EMPTY operations - и станет ясно почему это так долго работает.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33475725
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, ваши объяснения кое как понятны.

Но мне не понятно, что должен возвращать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with 

member measures.mymember as 
count(nonemptycrossjoin(
	
		{[Customer].[Customer].[Customer].MEMBERS},
		{[Product].[Product].[Product].MEMBERS}
))

select {measures.mymember} on  0 
from [Adventure Works]

Он возвращает 11201304 за 1:37

В то время как

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
with 
set set1 as nonemptycrossjoin(
		{[Customer].[Customer].[Customer].MEMBERS},
		{[Product].[Product].[Product].MEMBERS})
member measures.mymember as 
count(set1)

select {measures.mymember} on  0 
from [Adventure Works]

возвращает за 6173656 0:47

и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
with 
set set1 as nonempty(
		{[Customer].[Customer].[Customer].MEMBERS}*
		{[Product].[Product].[Product].MEMBERS})
member measures.mymember as 
count(set1)

select {measures.mymember} on  0 
from [Adventure Works]

возвращает 6173656 за 0:40
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33476011
Беляев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoshaСпасибо г-ну Беляеву - действительно current measure это и есть calculated measure и казалось бы должна быть бесконечная рекурсия. Но AS2005 умеет бороться с такой рекурсией когда цикл рекурсии всего одно звено. Ошибка из-за другого - поскольку есть вычисления наложенные поверх Non Empty, то QO приходится итерировать по всему сету, а там действительно много туплов. Эту ошибку я вставил как предохранитель, чтобы не сидели пользователи часами и ждали пока проитерирует по такому количеству туплов. А вот не было бы вычисления, QO этот бы запрос разделал бы быстро и легко.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights

Мне кажется, что AS должен в данном случае возвращать ошибку infinite recursion, а не пытаться с ней побороться. Ну хотя бы это должно настраиваться. Я не прав?

Владислав Беляев
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33477618
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БеляевМне кажется, что AS должен в данном случае возвращать ошибку infinite recursion, а не пытаться с ней побороться. Ну хотя бы это должно настраиваться. Я не прав?
Я с Вами согласен. Проблема в том как AS может определить когда автоматическое разрешение рекурсии надо делать, а когда нет. Например, в таком примере:

Код: plaintext
Sales = Sales*Tax;

мы не хотим давать ошибку (как это было в АS2000). Идея была в том, что пользователи будут использовать рекурсию на самого себя когда это действительно имеет смысл, а не тогда когда в этом смысла нет. Я понимаю, что backfire сделал свой пример исключительно в целях тестирования, никакой реальной проблемы его запрос не решает. Дать возможность настройки - звучит как хорошая идея, но кто этой настройкой будет пользоваться ? Ведь те кто обычно попадает в бесконечную рекурсию, вряд ли об этом догадываются - иначе зачем бы они писали формулы которые заведомо должны дать ошибку...

backfireНо мне не понятно, что должен возвращать?
Это тоже все обьяснимо. Когда Вы создаете named set, то он считается статически один раз и с координатой по мерам которая DefaultMeasure. Поэтому и результат такой и считает он очень быстро. И нет разницы между NonEmpty и NonEmptyCrossJoin, т.к. для DefaultMeasure нет в AdventureWorks никаких вычислений. А вот в первом запросе, NonEmptyCrossJoin должна работать при текущей координате в мерах - calculated measure. И кому как не Вам знать что тогда происходит - мы ведь в SP4 даже чинили такой баг по Вашей наводке :) Надо пройти по всем measure groups - и это занимает больше времени и результат тоже больше.
Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
AS2005. Где ошибка в MDX?
    #33478630
Беляев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoshaПроблема в том как AS может определить когда автоматическое разрешение рекурсии надо делать, а когда нет. Например, в таком примере:

Код: plaintext
Sales = Sales*Tax;

мы не хотим давать ошибку (как это было в АS2000). Идея была в том, что пользователи будут использовать рекурсию на самого себя когда это действительно имеет смысл, а не тогда когда в этом смысла нет.

Красивая формула...
Как мы уже говорили, за красоту надо платить. А что если сделать какое-то свойство у Calculated members типа Solve_order, которое разрешало бы вот такое, как в приведенном Вами примере, разрешение рекурсии и в скриптах тоже свойство какое-то. По умолчанию Infinite recursion запрещена и выдается ошибка, но поменяв значение данного свойства можно определить максимально разрешенное число итераций и добится эффекта как в примере.

Mosha
Дать возможность настройки - звучит как хорошая идея, но кто этой настройкой будет пользоваться ? Ведь те кто обычно попадает в бесконечную рекурсию, вряд ли об этом догадываются - иначе зачем бы они писали формулы которые заведомо должны дать ошибку...


Так вот ведь и получается что ошибки может и не возникнуть, и будем ломать голову что же происходить, почему неверные данные лезут. А это не так просто бесконечную рекурсию выявить в MDX, где существует текущий контекст и прочие разные умолчания. Что собственно backfire и показал

Владислав Беляев
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / AS2005. Где ошибка в MDX?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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