成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談SSAS計算中MDX性能改進的幾個技巧

開發 開發工具
本文提供了一些簡單的技巧,可以幫助你在SSAS的計算中表現出最佳的性能。其中一些是在SSAS 2005/2008中新開發的函數。

1.使用半加性度量值替代Calculation

這算是半加性度量值函數的模擬能力之一,但是,有些只在SSAS Enterprise SKU版本中才支持。但是半加性函數操作更快,差不多是MDX腳本兩本的速度

2.使用一元操作符替代Calculation

服從分配律一元操作符(與位置順序無關的操作符)一般來說要比同樣作用的賦值操作快兩倍。那是不是所有的Calculation都要抽取出來,然后用一元操作符替換呢,答案是否定的。例外就是那些不服從分配律的一元操作符(包括*,/或者數字值)。在這種情況下,才會有可能改進性能。

3.減小集合計算的大小

當計算值是基于集合,使用NONEMPTY函數減小集合的大小。例如,當計算城市間每個產品的銷售平均值,這個查詢大約耗時1分46秒,在我的機器上:

  1. with member measures.x as avg(existing  
  2. [Product].[Product].[Product].members*[Customer].[Customer Geography].[City].members,  
  3. [Measures].[Internet Sales Amount])  
  4. select [Date].[Calendar].[Month].members on 0,  
  5. non empty [Product].[Subcategory].members on 1  
  6. from [Adventure Works] where measures.x 

但是添加了NONEMPTY,耗時大約39秒:

  1. with member measures.x as avg(existing   
  2. nonempty( [Product].[Product].[Product].members*[Customer].[Customer Geography].[City].members,[Measures].[Internet Sales Amount])  
  3. , [Measures].[Internet Sales Amount])  
  4. select [Date].[Calendar].[Month].members on 0,  
  5. non empty [Product].[Subcategory].members on 1  
  6. from [Adventure Works] where measures.x 

避免賦給cell像0, Null, “N/A”, “-“ 這樣的值
之前翻譯的文章已經提過了,AS的引擎在排除空行方面是很高效的。下面的查詢使用"-"替換了null值,并且non empty不會排出它們:

  1. with member measures.x as  
  2. iif( not isempty([Measures].[Internet Sales Amount]),[Measures].[Internet Sales Amount],"-")  
  3. select descendants([Date].[Calendar].[Calendar Year].&[2004] ) on 0,  
  4. non empty [Customer].[Customer Geography].[Customer].members on 1  
  5. from [Adventure Works]  
  6. where measures.x 

Non empty操作符不能用來格式化的值上,因此要使用格式化字符串的方式來替換null值,但卻排除了空的行,耗時大約是一半的時間:

  1. with member measures.x as  
  2. [Measures].[Internet Sales Amount], FORMAT_STRING = "#.00;(#.00);#.00;-" 
  3. select descendants([Date].[Calendar].[Calendar Year].&[2004] ) on 0,  
  4. non empty [Customer].[Customer Geography].[Customer].members on 1  
  5. from [Adventure Works]  
  6. where measures.x 

有的讀者可能已經觀察到,上面的兩個查詢其實是不等效的——第二個查詢完全排除了空行。

4.計算格式化值的成本

在某些情況下,采用格式化字符串的成本消耗甚至操作了求值本身。這時候就需要對比是否應用格式化屬性時兩者的執行時間,例如:

  1. select [Measures].[Internet Average Sales Amount] on 0 from [Adventure Works] cell properties value  
  2. 如果不帶格式化的結果明顯快的話,可以使用下面的語句實現格式化:  
  3. scope([Measures].[Internet Average Sales Amount]);  
  4. FORMAT_STRING(this) = "currency";  
  5. end scope; 

執行這個查詢(應用了格式化),然后在決定是否采用吧

5.使用屬性

在SSAS 2000中,當要查找一個集合中哪些成員滿足條件通常使用filter函數,例如下面查找男性的顧客:

Filter(Customer.name.Name.members, Customer.name.currentmember.properties(“Gender”) = “Male”)

在SSAS 2005/2008中這樣的方式就要避免了,取而代之的是添加一個hierarchy屬性Customers.Gender :

(Customers.Gender.Male, Measures.Sales)

這個hierarchy屬性可以對終端用戶隱藏,但是對MDX表達式仍然有效。

下面查詢男性客戶的平均銷售額:

Avg(Customer.Name.Name.members*Customers.Gender.Male, Measures.Sales)

為什么使用.properties會慢呢?因為在獲取一個成員的時候每個成員其實都要獲取到,這樣才能得到property的值,EXISTS更快些是因為直接使用了內部存儲結構

6.使用IS比較操作符

當比較成員時,比較對象時使用IS,不要像下面這樣:

Iif( [Currency Code].currentmember.Name = “USA”], …)

正確的方法是:

Iif( [Currency Code].currentmember IS [Currency Code].[USA], …)

這是因為***個語句要將成員轉型為string,這是要耗時的,而且沒有必要

7.使用NONEMPTY函數

NONEMPTY函數(SSAS 2005新增的)在提出元組方面進行了優化,因此下面的查詢就不可取了:

Filter(Customer.Name.members, not IsEmpty( ([Measures].[Unit Sales], [Product].[Name].[Xbox])

合適的方式是:

NonEmpty (Customer.Name.members, ([Measures].[Unit Sales], [Product].[Name].[Xbox]))

其實Filter(, Not Isempty()) 和NonEmpty(,) 是等效的,現在引擎已經自動做了優化

另外:

  1. Count(Filter([year and month].[Month],  
  2. Not IsEmpty(([Project Count], [Layer].[Layer].[web]))   
  3. or Not IsEmpty(([Project Count], [Layer].[Layer].[server])))) 

上面的方式也不可取,應該這樣:

  1. Count(NonEmpty ([year and month].[Month],{([Project Count],   
  2. [Layer].[Layer].[web]), ([Project Count], [Layer].[Layer].[server])}) 

8.條件計算

IIF的存在可能會破環引擎的優化,因為優化器不能接受在求值過程中的表達式,這個問題可能以后會解決,但是可以采用一些方案繞過這個問題:

9.條件計算和條件域

IIF有時候用于限定應用于集合成員的計算的域,例如:

  1. This =  
  2. IIF([account].[Account Type].currentmember IS [Account].[Account Type].[Flow],   
  3. ,   
  4. )  

上面的做法不推薦,下面可能會獲得更好的性能:

  1. Scope ([Account].[Account Type].[Flow]);  
  2. This = ;  
  3. End Scope;  
  4. Scope ([Account].[Account Type].[Account Type].members –   
  5. [Account].[Account Type].[Flow]);  
  6. This = ;  
  7. End Scope; 

10.使用ValidMeasure減少計算求值的空間消耗

在SSAS 2005中,每個度量值組都有一個IgnoreUnrelatedDimensions 屬性,這個屬性定義了如何處理與度量值不相關的維度 --或者忽略這個維度,或者剔除默認成員上的空值。

在定義計算的時候,不要使用這個behavior而是使用ValidMeasuer函數,例如:

  1. scope(leaves([Time]), [Currency].[Currency].members - [Currency].[Currency].[Currency].[USA]  
  2. Scope [Measures].[store Sales];  
  3. This = iif( isempty(validmeasure([Measures].[Exchange Rate])), null, [Measures].[Store Sales]/validmeasure([Measures].[Exchange Rate]));  
  4. End Scope; 

11.使用Sum或Aggregate替代求和運算,

避免:

Create Member measures.x as

(Sales, Country.USA) + (Sales, Country.Canada) + (Sales, Country.Mexico)…

推薦:

Create Member measures.x as Sum({Country.USA, Country.Canada, Country.Mexico}, Sales)

12.在大數據量Crossjoin中多重的Hierarchy

如果可能,盡量使在同一緯度中的hierarchy在一起。為什么呢?因為在引擎內部有一個exists在進行Crossjoin的相鄰的集合之間。如果一個來自不用緯度的hierarchy插在兩個屬于相同緯度的hierarchy之間,exists的行為會變化,就會增加占用的空間,影響性能

13.緩存計算結果

在公式引擎內部有一個緩存,用于重用計算結果,但是要進行緩存,這個結果在Cube空間中就要有一個可定地址的單元格或者元組。

例如,一個應用程序在集合中定義了一個比率:一個值除***值,并且展示為柱狀圖。

***種方法:

  1. with   
  2. member measures.y as  
  3. measures.[unit sales]  
  4. /  
  5. max(customers.[name].[name].members, measures.[unit sales])  
  6. select  
  7. measures.y on 0,  
  8. customers.[name].[name].members on 1  
  9. from sales 

這個執行大約需要15秒。這個計算其實效率不高,因為***值其實是不變的,但是每次表達式都要進行求值,下面的查詢就要好一些:

  1. with   
  2. member measures.x as   
  3. max(customers.[name].[name].members, measures.[unit sales])  
  4. member measures.y as  
  5. measures.[unit sales]  
  6. /  
  7. (measures.x,[Customers].[Customers].[All Customers] )  
  8. select   
  9. measures.y on 0,  
  10. customers.[name].[name].members on 1  
  11. from sales 

這個查詢不到1秒!性能得到了數量級的提升!

不知道讀者有沒有注意到一個問題?為什么SSAS表達式中的measure.y必須要在分母中包含[Customers].[Customers].[All Customers] ,換句話說為什么不能這樣:

  1. with   
  2. member measures.x as   
  3. max(customers.[name].[name].members, measures.[unit sales])  
  4. member measures.y as  
  5. measures.[unit sales]  
  6. /  
  7. (measures.x)  
  8. select   
  9. measures.y on 0,  
  10. customers.[name].[name].members on 1  
  11. from sales  

這是因為我們需要引用緩存值。如果[Customers].[Customers].[All Customers]沒有寫上customer維度的屬性,那么單元格會跟著客戶名的引用和計算值變化,而計算值每次都要重新求值

【編輯推薦】

  1. 在T-SQL中使用臨時表的注意事項
  2. SQL Server數據庫管理常用的SQL和T-SQL語句(1)
  3. 用T-SQL操作面試SQL Server開發人員(1)
  4. SQL Server 2005中的T-SQL
  5. T-SQL實用例句
  6. 微軟SQLServer密碼管理的危險判斷
責任編輯:彭凡 來源: cnblogs
相關推薦

2014-09-17 11:20:38

AndroidListView技巧

2011-07-05 14:59:17

java

2022-04-06 07:32:41

Java運算符變量

2011-06-08 16:52:16

軟件測試

2015-01-12 15:36:27

云網絡性能云性能監測應用性能監測

2019-09-26 08:33:51

Nginx技術Java

2010-03-02 10:08:28

Android源代碼

2021-09-08 09:41:09

開發Go代碼

2019-08-14 15:40:05

Web圖片優化前端

2013-06-03 10:02:53

WAF繞過

2024-10-24 08:07:25

大語言模型LLMRAG模型

2011-03-02 17:56:40

DB2數據庫

2011-04-19 10:53:05

SSAS

2011-08-19 15:48:13

SQL Server 結果集Sets使用技巧

2022-09-07 00:04:37

JavaScript運算符技巧

2021-06-27 06:25:14

代碼優化技巧Java

2010-09-08 15:19:46

生產環境性能測試風險

2015-02-04 10:32:57

Objective-CSwift

2017-03-13 16:48:05

Git技巧

2011-05-05 09:25:35

噴墨打印機指標術語
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美色影院 | 日韩精品1区2区 | 国产9 9在线 | 中文 | 天天综合成人网 | 国产午夜精品久久 | www.788.com色淫免费 | 涩涩导航 | 国产综合在线视频 | 国产精品久久久久久一区二区三区 | 黄色在线观看国产 | 亚洲在线| 成人免费xxxxx在线视频 | 成人免费视频网站 | 我要看黄色录像一级片 | 91精品国产综合久久香蕉麻豆 | 日韩精品免费视频 | 色综合视频在线 | 亚洲区视频 | 日本不卡一区二区三区在线观看 | 久草.com| 午夜日韩精品 | 男女国产网站 | 97伦理最新伦理 | 国产精品资源在线 | 日本一区二区在线视频 | 91精品国产91久久久久久最新 | 欧美久久综合 | 成人午夜免费福利视频 | 九九精品网 | 中文字幕一区二区三区四区 | 中文字幕高清av | 日韩三极 | 欧洲高清转码区一二区 | 精品国产欧美一区二区三区成人 | 欧美精品一区二区在线观看 | 亚洲欧美在线视频 | 日日摸日日爽 | 欧美精品在线播放 | 国产精品99视频 | 91九色在线观看 | 99久久成人|