当前位置:文档之家› 创建并管理SQL Server Analysis Services分区

创建并管理SQL Server Analysis Services分区

创建并管理SQL Server Analysis Services分区
创建并管理SQL Server Analysis Services分区

创建并管理SQL Server Analysis Services分区

分区是SQL Server Analysis Services度量值组的一部分,它保存度量值组的一些或全部数据。

当一个度量值组被首先创建之后,它包含了一个单一的分区,相当于事实表或视图中的所有数据。额外的分区需要为有超过2000万行数据的度量值组而创建。

由于大多数企业数据库的事实表都有超过2000万行数据,所以你应该知道如何创建分区并注意良好分区的设计原则。

你可以Business Intelligence Development Studio (BIDS)定义分区。在项目的分区标签页上,点击新建分区来打开分区向导。另一种创建新分区的方法是使用XMLA脚本,这项工作是BIDS在后台完成的。

你可以在SQL Server Management Studio (SSMS)中编写已存在的分区脚本,只需右击一个分区,然后选择Script Partition创建脚本来打开新的查询窗口。你需要修改一些属性,比如分区标签、名称以及用于填充分区的查询等。

下面就是一个简单的分区XMLA:

< DatabaseID>Adventure Works DW 2008

< CubeID>Adventure Works

Fact Internet Sales 1

Internet_Sales_2001

Internet_Sales_2001

Adventure Works DW

SELECT

[dbo].[FactInternetSales].[ProductKey],

[dbo].[FactInternetSales].[OrderDateKey],

[dbo].[FactInternetSales].[DueDateKey],

[dbo].[FactInternetSales].[ShipDateKey],

[dbo].[FactInternetSales].[CustomerKey],

[dbo].[FactInternetSales].[PromotionKey],

[dbo].[FactInternetSales].[CurrencyKey],

[dbo].[FactInternetSales].[SalesTerritoryKey],

[dbo].[FactInternetSales].[SalesOrderNumber],

[dbo].[FactInternetSales].[SalesOrderLineNumber],

[dbo].[FactInternetSales].[RevisionNumber],

[dbo].[FactInternetSales].[OrderQuantity],

[dbo].[FactInternetSales].[UnitPrice],

[dbo].[FactInternetSales].[ExtendedAmount],

[dbo].[FactInternetSales].[UnitPriceDiscountPct],

[dbo].[FactInternetSales].[DiscountAmount],

[dbo].[FactInternetSales].[ProductStandardCost],

[dbo].[FactInternetSales].[TotalProductCost],

[dbo].[FactInternetSales].[SalesAmount],

[dbo].[FactInternetSales].[TaxAmt],

[dbo].[FactInternetSales].[Freight],

[dbo].[FactInternetSales].[CarrierTrackingNumber],

[dbo].[FactInternetSales].[CustomerPONumber]

FROM [dbo].[FactInternetSales]

WHERE OrderDateKey <= '20011231'

Molap

Regular

-PT1S

-PT1S

-PT1S

-PT1S

MolapOnly

Server

1013

Internet Sales 1

注意:当要定义有效分区时,确定数据来源是最重要的一步。从以往经验来看,你的分区必须包含5到2000万行实际数据。此外,你还要避免分区文件超过500MB。分区文件存储在Analysis Services目录下:

data\database_name\cube_name\measure_group_name。

你还可以将一个分区同表、视图和SQL查询绑定。如果一个关系型数据仓库有多个表单存储事实数据,并且表单大小不超过建议范围,那么你就应该将分区同表绑定。如果你有一个单一的大事实表,那么你可以为每一个Analysis Services分区写一个SQL 查询来检索部分数据。

视图为分区绑定提供了一个不错的选择,特别是在做立方体测试时。例如:如果事实表有数百万行数据,那么对它的处理就会十分耗时。在测试解决方案时,你不必读取所有数据,而只需创建一个视图,只选择表中部分行就可以了。

然后,当你准备将方案应用到生产中时,修改你的分区定义,让它们同适合的表、查询和视图绑定。

你如何决定什么样的数据应该出现在分区当中?SQL Server Analysis Services使用分区来加速MDX查询。每个分区都包含一个XML文件,它定义了某个分区内的成员维度标识范围。当执行一个MDX查询时,Analysis Services引擎将根据每个分区中的XML 文件value来决定扫描那些分区文件。

XML文件是在处理分区时创建的,它存储在每个分区文件夹中。不要试图编辑它,因为维度的关键参考值是内部值,SQL Server Analysis Services不可以进行检索。

如果MDX查询的数据请求遍布度量组的所有分区时,Analysis Services就不得不读取所有分区。想要知道度量组中哪些分区被读取了,你可以记录一个SQL Profiler追踪。如果查询数据请求只存在于单一分区中,你的查询只需扫描一个分区文件就可以了。

读取一个500MB的文件总比扫描总大小相同的200个文件要强。如果你要读取200个分区,Analysis Services可以并行扫描器中的一部分。要是有良好的分区设计,你就不必非要进行200次的缓慢查询了。

为达到最佳MDX查询性能,你应该调整分区设计以适应普通查询。大多数

SQL Server Analysis Services方案都以使用数据或周期维度的度量组分区开始,每个分区生成一个月或一天的数据。

如果你的查询通常集中在某个月内,这不失为一种好的方法。但是如果查询检验所有月份的数据并具体到产品类别该怎么办?这样的话,按月分区并不是最佳方法。

如果你有十年内的有用数据,并按月分区(这种情况并不常见),那每个查询将检索120个分区。这种情况下,如果按照产品类别维度来适当增长分区日期跨度,那么查询性能无疑会更好。

像其他SQL Server Analysis Services对象一样,分区拥有大量属性。而被谈论最多的恐怕就是partition slice了。这一属性定义了度量组中的部分数据,

Analysis Services期望它们被分区曝光。

大多数Analysis Services资料建议不必为多维OLAP存储分区而设置

partition slice属性。然而在大多数情况下,Analysis Services可以通过检测info.xml 文件中的数据ID来判断每个分区中的成员维度,为安全起见你应该设置partition slice属性,无论分区采用哪种存储模式。

partition slice通过MDX定义。下面是一个例子,2001分区的slice定义:

[Date].[Calendar].[Calendar Year]. &[2001]

按照产品分类进行数据分区,slice定义如下:

([Date].[Calendar].[Calendar Year]. & [2001], [Product].[Product Catego ries].[Category]. & [1])

你如果在某个维度中没有定义slice,SQL Server Analysis Services就默认为任何维度中的成员都能在分区中找到。

例如:在partition slice中指定一个月份和产品类别但没有指定商店。按照商店检索销售数据的查询可能就会检索所有分区了。

你还可以为每个分区都自定义一个存储模式。MOLAP存储模式对于数据检索是最佳的,但它会对你的相关数据进行拷贝。如果不想拷贝,你可以使用关系型OLAP模式。比如:最近的分区可以使用MOLAP模式而原来的分区可以使用ROLAP。

SQL Server Analysis Services对于分区数有一个上限2,147,483,647,但是cube 拥有这么多分区的情况并不常见。所以不必担心分区上限问题。

但数据很陈旧并很少有人访问时,你可以把原来的分区合并为周分区或月分区。你可以使用SSMS来合并分区,右键点击分区选择合并分区选项。

以下是一个合并分区的XMLA:

xmlns="https://www.doczj.com/doc/7c3529241.html,/analysisservices/2003/engine">

Adventure Works DW 2008

Adventure Works

Fact Internet Sales 1

Internet_Sales_2002

Adventure Works DW 2008

Adventure Works

Fact Internet Sales 1

Internet_Sales_2001

注意你可以把集合设计从一个分区拷贝到另一个分区。如果你对现有的集合设计满意的话,你可以把它分配到新创建的分区中去。

如果一个分区有500000行以上的估计行而你没有为它定义一个集合,那么BIDS将会提醒你可以创建集合来改善应用性能。

分区会降低处理度量组数据的时间,因为每个分区都只是负载部分事实表和视图。记住在运行期间,SQL Server Analysis Services会先修改查询并定义分区,然后才会将它送到关系数据源。

Analysis Services送到SQL Server的查询同原先的查询有着较大的区别:

SELECT

[dbo_FactInternetSales].[dbo_FactInternetSalesSalesAmount0_0] AS [dbo _FactInternetSalesSalesAmount0_0],

[dbo_FactInternetSales].[dbo_FactInternetSalesOrderQuantity0_1] AS [d bo_FactInternetSalesOrderQuantity0_1],

[dbo_FactInternetSales].[dbo_FactInternetSalesExtendedAmount0_2] AS [ dbo_FactInternetSalesExtendedAmount0_2],

[dbo_FactInternetSales].[dbo_FactInternetSalesTaxAmt0_3] AS [dbo_Fact InternetSalesTaxAmt0_3],

[dbo_FactInternetSales].[dbo_FactInternetSalesFreight0_4] AS [dbo_Fac tInternetSalesFreight0_4],

[dbo_FactInternetSales].[dbo_FactInternetSalesUnitPrice0_5] AS [dbo_F actInternetSalesUnitPrice0_5],

[dbo_FactInternetSales].[dbo_FactInternetSalesTotalProductCost0_6] AS [dbo_FactInternetSalesTotalProductCost0_6],

[dbo_FactInternetSales].[dbo_FactInternetSalesProductStandardCost0_7] AS [dbo_FactInternetSalesProductStandardCost0_7],

[dbo_FactInternetSales].[dbo_FactInternetSales0_8] AS [dbo_FactIntern etSales0_8],

[dbo_FactInternetSales].[dbo_FactInternetSalesPromotionKey0_9] AS [db o_FactInternetSalesPromotionKey0_9],

[dbo_FactInternetSales].[dbo_FactInternetSalesSalesTerritoryKey0_10] AS [dbo_FactInternetSalesSalesTerritoryKey0_10],

[dbo_FactInternetSales].[dbo_FactInternetSalesProductKey0_11] AS [dbo _FactInternetSalesProductKey0_11],

[dbo_FactInternetSales].[dbo_FactInternetSalesCustomerKey0_12] AS [db o_FactInternetSalesCustomerKey0_12],

[dbo_FactInternetSales].[dbo_FactInternetSalesCurrencyKey0_13] AS [db o_FactInternetSalesCurrencyKey0_13],

[dbo_FactInternetSales].[dbo_FactInternetSalesOrderDateKey0_14] AS [d bo_FactInternetSalesOrderDateKey0_14],

[dbo_FactInternetSales].[dbo_FactInternetSalesShipDateKey0_15] AS [db o_FactInternetSalesShipDateKey0_15],

[dbo_FactInternetSales].[dbo_FactInternetSalesDueDateKey0_16] AS [dbo _FactInternetSalesDueDateKey0_16]

FROM

(

SELECT

[SalesAmount] AS [dbo_FactInternetSalesSalesAmount0_0],

[OrderQuantity] AS [dbo_FactInternetSalesOrderQuantity0_1],

[ExtendedAmount] AS [dbo_FactInternetSalesExtendedAmount0_2], [TaxAmt] AS [dbo_FactInternetSalesTaxAmt0_3],

[Freight] AS [dbo_FactInternetSalesFreight0_4],

[UnitPrice] AS [dbo_FactInternetSalesUnitPrice0_5],

[TotalProductCost] AS [dbo_FactInternetSalesTotalProductCost0_6],

[ProductStandardCost] AS [dbo_FactInternetSalesProductStandardCost0_7 ],

1 AS [dbo_FactInternetSales0_8],

[PromotionKey] AS [dbo_FactInternetSalesPromotionKey0_9],

[SalesTerritoryKey] AS [dbo_FactInternetSalesSalesTerritoryKey0_10], [ProductKey] AS [dbo_FactInternetSalesProductKey0_11],

[CustomerKey] AS [dbo_FactInternetSalesCustomerKey0_12],

[CurrencyKey] AS [dbo_FactInternetSalesCurrencyKey0_13],

[OrderDateKey] AS [dbo_FactInternetSalesOrderDateKey0_14],

[ShipDateKey] AS [dbo_FactInternetSalesShipDateKey0_15],

[DueDateKey] AS [dbo_FactInternetSalesDueDateKey0_16]

FROM

(

SELECT

[dbo].[FactInternetSales].[ProductKey],

[dbo].[FactInternetSales].[OrderDateKey],

[dbo].[FactInternetSales].[DueDateKey],

[dbo].[FactInternetSales].[ShipDateKey],

[dbo].[FactInternetSales].[CustomerKey],

[dbo].[FactInternetSales].[PromotionKey],

[dbo].[FactInternetSales].[CurrencyKey],

[dbo].[FactInternetSales].[SalesTerritoryKey],

[dbo].[FactInternetSales].[SalesOrderNumber],

[dbo].[FactInternetSales].[SalesOrderLineNumber],

[dbo].[FactInternetSales].[RevisionNumber],

[dbo].[FactInternetSales].[OrderQuantity],

[dbo].[FactInternetSales].[UnitPrice],

[dbo].[FactInternetSales].[ExtendedAmount],

[dbo].[FactInternetSales].[UnitPriceDiscountPct],

[dbo].[FactInternetSales].[DiscountAmount],

[dbo].[FactInternetSales].[ProductStandardCost],

[dbo].[FactInternetSales].[TotalProductCost],

[dbo].[FactInternetSales].[SalesAmount],

[dbo].[FactInternetSales].[TaxAmt],

[dbo].[FactInternetSales].[Freight],

[dbo].[FactInternetSales].[CarrierTrackingNumber],

[dbo].[FactInternetSales].[CustomerPONumber]

FROM [dbo].[FactInternetSales]

WHERE OrderDateKey <= '20011231'

) AS [FactInternetSales]

)

AS [dbo_FactInternetSales]

在进行分区处理时,为什么你要去关心什么样的查询被送到SQL Server中?因为在常规SQL语句中的查询提示或设置选项换到分区中可能会无效。

例如:BIDS会允许我们在分区查询开始时附加SET NOCOUNT ON声明。如果我们添加此选项,SQL Server Analysis Services会报错并中止进程。

你可以自定义分区处理模式,它定义了集合是否在分区处理中创建,还是在完成分区处理之后创建。

最后,你可以修改存储位置属性来决定数据存储的位置。这个属性在硬盘存储空间不足的情况下会发挥作用的。

相关主题
文本预览
相关文档 最新文档