Compartilhar via


Autoexists

Aplica-se a: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

O conceito de autoexists limita o espaço do cubo às células que realmente existem no cubo, em contraposição às que poderiam existir como resultado da criação de todas as combinações possíveis de membros da hierarquia de atributos da mesma hierarquia. Isso ocorre porque os membros de uma hierarquia de atributo não podem existir com membros de outra hierarquia de atributos na mesma dimensão. Quando duas ou mais hierarquias de atributo da mesma dimensão são usadas em uma instrução SELECT, o Analysis Services avalia as expressões dos atributos para garantir que os membros desses atributos estejam devidamente confinados para atender aos critérios de todos os outros atributos.

Por exemplo, suponha que você esteja trabalhando com atributos da dimensão Geografia. Se você tiver uma expressão que retorna todos os membros do atributo City e outra expressão que limita os membros do atributo Country a todos os países/regiões da Europa, isso resultará na limitação dos membros da cidade apenas às cidades que pertencem a países/regiões da Europa. Isso ocorre devido à característica 'autoexists' do Analysis Services. Autoexists só se aplica a atributos da mesma dimensão porque tenta impedir que os registros da dimensão excluídos em uma expressão de atributo sejam incluídos por outras expressões de atributo. Autoexists também podem ser entendidos como a interseção resultante das diferentes expressões de atributos aplicadas às linhas de dimensão.

Existência de célula

As seguintes células sempre existem:

  • O membro (All), de todas as hierarquias, quando cruzado com membros de outras hierarquias na mesma dimensão.

  • Membros calculados quando combinados com seus elementos irmãos não calculados, ou com os pais ou descendentes de seus elementos irmãos não calculados.

Fornecendo células não existentes

Uma célula não existente é uma célula fornecida pelo sistema como uma resposta a uma consulta ou cálculo que solicita uma célula que não existe no cubo. Por exemplo, se você tiver um cubo que tenha uma hierarquia de atributos de Cidade e uma hierarquia de atributos de País que pertençam à dimensão Geografia e uma medida Valor de Vendas da Internet, o espaço desse cubo incluirá apenas os membros que existem simultaneamente. Por exemplo, se a hierarquia de atributos da cidade incluir as cidades Nova York, Londres, Paris, Tóquio e Melbourne; e a hierarquia de atributo País inclui os países/regiões Estados Unidos, Reino Unido, França, Japão e Austrália; em seguida, o espaço do cubo não inclui o espaço (célula) na interseção de Paris e Estados Unidos.

Ao consultar células que não existem, as células não existentes retornam nulos; ou seja, eles não podem conter cálculos e você não pode definir um cálculo que grava nesse espaço. Por exemplo, a instrução a seguir inclui células que não existem.

SELECT [Customer].[Gender].[Gender].Members ON COLUMNS,  
{[Customer].[Customer].[Aaron A. Allen]  
   ,[Customer].[Customer].[Abigail Clark]} ON ROWS   
FROM [Adventure Works]  
WHERE Measures.[Internet Sales Amount]  

Observação

Essa consulta usa a função Membros (Conjunto) (MDX) para retornar o conjunto de membros da hierarquia de atributos de gênero no eixo de coluna e cruza esse conjunto com o conjunto especificado de membros da hierarquia de atributos cliente no eixo de linha.

Quando você executa a consulta anterior, a célula na interseção de Aaron A. Allen e Female exibe um valor nulo. Da mesma forma, a cela na interseção de Abigail Clark e Male exibe um nulo. Essas células não existem e não podem conter um valor, mas as células que não existem podem aparecer no resultado retornado por uma consulta.

Quando você usa a função MDX (Crossjoin) para retornar o produto cruzado de membros da hierarquia de atributos de hierarquias de atributo na mesma dimensão, existe automaticamente os limites dessas tuplas que estão sendo retornadas para o conjunto de tuplas que realmente existem, em vez de retornar um produto cartesiano completo. Por exemplo, execute e examine os resultados da execução da consulta a seguir.

SELECT CROSSJOIN  
   (  
      {[Customer].[Country].[United States]},  
         [Customer].[State-Province].Members  
  ) ON 0   
FROM [Adventure Works]  
WHERE Measures.[Internet Sales Amount]  

Observação

Observe que 0 é usado para designar o eixo de coluna, que é abreviação para eixo(0) – que é o eixo da coluna.

A consulta anterior retorna apenas células para membros de cada hierarquia de atributo na consulta que existem entre si. A consulta anterior também pode ser gravada usando a nova variante * da função * (Crossjoin) (MDX ).

SELECT   
   [Customer].[Country].[United States] *   
      [Customer].[State-Province].Members  
ON 0   
FROM [Adventure Works]  
WHERE Measures.[Internet Sales Amount]  

A consulta anterior também pode ser escrita da seguinte maneira:

SELECT [Customer].[State-Province].Members  
ON 0   
FROM [Adventure Works]  
WHERE (Measures.[Internet Sales Amount],  
   [Customer].[Country].[United States])  

Os valores de células retornados serão idênticos, embora os metadados no conjunto de resultados sejam diferentes. Por exemplo, com a consulta anterior, a hierarquia Country foi movida para o eixo da segmentação (na cláusula WHERE) e, portanto, não aparece explicitamente no conjunto de resultados.

Cada uma dessas três consultas anteriores demonstra o efeito do comportamento existente automaticamente no SQL Server SQL Server Analysis Services.

Deep and Shallow Autoexists

Os Autoexists podem ser aplicados às expressões como Deep ou Shallow. Autoexists profundos significa que todas as expressões serão avaliadas para atender ao espaço mais profundo possível depois de aplicar as expressões de fatiamento, as expressões de sub-seleção no eixo, e assim por diante. Autoexists Shallow significa que expressões externas anteriores são avaliadas, e esses resultados são passados para a expressão atual. A configuração padrão é "autoexists" profunda.

O cenário e os exemplos a seguir ajudarão a ilustrar os diferentes tipos de Autoexists. Nos exemplos a seguir, dois conjuntos serão criados: um como uma expressão calculada e outro como uma expressão constante.

//Obtain the Top 10 best reseller selling products by Name

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'

set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'

set Preferred10Products as '

{[Product].[Model Name].&[Mountain-200],

[Product].[Model Name].&[Road-250],

[Product].[Model Name].&[Mountain-100],

[Product].[Model Name].&[Road-650],

[Product].[Model Name].&[Touring-1000],

[Product].[Model Name].&[Road-550-W],

[Product].[Model Name].&[Road-350-W],

[Product].[Model Name].&[HL Mountain Frame],

[Product].[Model Name].&[Road-150],

[Product].[Model Name].&[Touring-3000]

}'

select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,

Top10SellingProducts on 1

from [Adventure Works]

O conjunto de resultados obtido é:

Valor de vendas do revendedor Valor do Desconto Desconto de PCT
Montanha-200 $14.356.699,36 US$ 19.012,71 0,13%
Estrada-250 $9.377.457,68 $4.032,47 0,04%
Montanha-100 $8.568.958,27 $139.393,27 1,63%
Estrada-650 $7.442.141,81 $39.698,30 0,53%
Touring-1000 $6.723.794,29 $166.144,17 2.47%
Road-550-W $3.668.383,88 US$ 1.901,97 0,05%
Estrada-350-W $3.665.932,31 US$ 20.946,50 0,57%
HL Mountain Frame $3.365.069,27 US$ 174,11 0,01%
Estrada-150 $2.363.805,16 US$ 0,00 0,00%
Touring-3000 $2.046.508,26 $79.582,15 3.89%

O conjunto de produtos obtido parece ser o mesmo que Preferred10Products; portanto, verificando o conjunto Preferred10Products:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'

set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'

set Preferred10Products as '

{[Product].[Model Name].&[Mountain-200],

[Product].[Model Name].&[Road-250],

[Product].[Model Name].&[Mountain-100],

[Product].[Model Name].&[Road-650],

[Product].[Model Name].&[Touring-1000],

[Product].[Model Name].&[Road-550-W],

[Product].[Model Name].&[Road-350-W],

[Product].[Model Name].&[HL Mountain Frame],

[Product].[Model Name].&[Road-150],

[Product].[Model Name].&[Touring-3000]

}'

select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,

Preferred10Products on 1

from [Adventure Works]

De acordo com os resultados a seguir, ambos os conjuntos (Top10SellingProducts, Preferred10Products) são os mesmos

Valor de vendas do revendedor Valor do Desconto Desconto de PCT
Montanha-200 $14.356.699,36 US$ 19.012,71 0,13%
Estrada-250 $9.377.457,68 $4.032,47 0,04%
Montanha-100 $8.568.958,27 $139.393,27 1,63%
Estrada-650 $7.442.141,81 $39.698,30 0,53%
Touring-1000 $6.723.794,29 $166.144,17 2.47%
Road-550-W $3.668.383,88 US$ 1.901,97 0,05%
Estrada-350-W $3.665.932,31 US$ 20.946,50 0,57%
HL Mountain Frame $3.365.069,27 US$ 174,11 0,01%
Estrada-150 $2.363.805,16 US$ 0,00 0,00%
Touring-3000 $2.046.508,26 $79.582,15 3.89%

O exemplo a seguir ilustrará o conceito de autoexistas profundos. No exemplo, estamos filtrando Top10SellingProducts pelo atributo [Produto].[Linha do Produto] para aqueles no grupo [Mountain]. Observe que os dois atributos (fatiador e eixo) pertencem à mesma dimensão, [Produto].

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'

set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'

// Preferred10Products set removed for clarity

select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,

Top10SellingProducts on 1

from [Adventure Works]

where [Product].[Product Line].[Mountain]

Produz o seguinte conjunto de resultados:

Valor de vendas do revendedor Valor do Desconto Desconto de PCT
Montanha-200 $14.356.699,36 US$ 19.012,71 0,13%
Montanha-100 $8.568.958,27 $139.393,27 1,63%
HL Mountain Frame $3.365.069,27 US$ 174,11 0,01%
Montanha-300 $1.907.249,38 US$ 876,95 0,05%
Montanha-500 $1.067.327,31 US$ 17.266,09 1,62%
Mountain-400-W $592.450,05 US$ 303,49 0,05%
Quadro da Montanha LL $521.864,42 US$ 252,41 0,05%
ML Mountain Frame-W $482.953,16 US$ 206,95 0,04%
Quadro da Montanha ML $343.785,29 US$ 161,82 0,05%
Short feminino para montanhismo US$ 260.304,09 $6.675,56 2,56%

No conjunto de resultados acima, temos sete recém-chegados à lista de Top10SellingProducts e Mountain-200, Mountain-100 e HL Mountain Frame passaram para o topo da lista. No conjunto de resultados anterior, esses três valores foram intercalados.

Isso é chamado de Deep Autoexists, pois o conjunto Top10SellingProducts é avaliado para atender às condições de fatiamento da consulta. Autoexists profundos significa que todas as expressões serão avaliadas para atender ao espaço mais profundo possível, após aplicar as expressões de segmentação de dados, as expressões de sub-seleção no eixo e assim por diante.

No entanto, alguém pode querer ser capaz de fazer a análise sobre o Top10SellingProducts como equivalente ao Preferred10Products, como no exemplo a seguir:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'

set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'

set Preferred10Products as '

{[Product].[Model Name].&[Mountain-200],

[Product].[Model Name].&[Road-250],

[Product].[Model Name].&[Mountain-100],

[Product].[Model Name].&[Road-650],

[Product].[Model Name].&[Touring-1000],

[Product].[Model Name].&[Road-550-W],

[Product].[Model Name].&[Road-350-W],

[Product].[Model Name].&[HL Mountain Frame],

[Product].[Model Name].&[Road-150],

[Product].[Model Name].&[Touring-3000]

}'

select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,

Preferred10Products on 1

from [Adventure Works]

where [Product].[Product Line].[Mountain]

Produz o seguinte conjunto de resultados:

Valor de vendas do revendedor Valor do Desconto Desconto de PCT
Montanha-200 $14.356.699,36 US$ 19.012,71 0,13%
Montanha-100 $8.568.958,27 $139.393,27 1,63%
HL Mountain Frame $3.365.069,27 US$ 174,11 0,01%

Nos resultados acima, o fatiamento fornece um resultado que contém apenas aqueles produtos de Preferred10Products que fazem parte do grupo [Mountain] em [Product].[Product Line]; como esperado, porque Preferred10Products é uma expressão constante.

Esse conjunto de resultados também é entendido como Shallow Autoexists. Isso ocorre porque a expressão é avaliada antes da cláusula de fatiamento. No exemplo anterior, a expressão era uma expressão constante para fins ilustrativos para introduzir o conceito.

O comportamento do Autoexists pode ser modificado no nível da sessão usando a propriedade da cadeia de conexão Autoexists. O exemplo a seguir começa abrindo uma nova sessão e adicionando a propriedade Autoexists=3 à cadeia de conexão. Você deve abrir uma nova conexão para fazer o exemplo. Depois que a conexão for estabelecida com a configuração Autoexist, ela permanecerá em vigor até que essa conexão seja concluída.

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'

set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'

//Preferred10Products set removed for clarity

select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,

Top10SellingProducts on 1

from [Adventure Works]

where [Product].[Product Line].[Mountain]

O conjunto de resultados a seguir agora mostra o comportamento superficial do Autoexists.

Valor de vendas do revendedor Valor do Desconto Desconto de PCT
Montanha-200 $14.356.699,36 US$ 19.012,71 0,13%
Montanha-100 $8.568.958,27 $139.393,27 1,63%
HL Mountain Frame $3.365.069,27 US$ 174,11 0,01%

O comportamento do Autoexists pode ser modificado usando o parâmetro AUTOEXISTS=[1|2|3] na cadeia de conexão; consulte Propriedades XMLA com suporte (XMLA) e ConnectionString para uso de parâmetro.

Consulte Também

Principais conceitos no MDX (Analysis Services)
Espaço em Cubo
Tuplas
Trabalhando com membros, tuplas e conjuntos (MDX)
Totais visuais e totais não visuais
Referência de linguagem MDX (MDX)
Referência de expressões multidimensionais (MDX)