技术开发 频道

SQL Server 2008数据仓库可扩展性

GROUPING SETS

GROUPING SETS 使你能够编写一个生成多个组并返回单独结果集的查询。这个结果集等同于对不同的分组记录进行UNION ALL。使用GROUPING SETS,你可以关注于你的业务所需要的不同级别信息(分组),而不是如何组合多个查询结果。

GROUPING SETS通过改进查询性能,使你可以很简单地编写出具有多个分组的报表。 
 
下面的示例虽然简单,但是很具代表性,使用AdventureWorksDW样例数据库,你可能会在特定的报表阶段想看看下面的聚合:
按季度和国家统计的总销售量
所有国家按季节统计的总销售量
总销售量 
 
如果没有GROUPING SETS ,那么你要获得这个结果就必须运行多个查询,或者使用UNION ALL 组合这些查询,以便获得一个结果集。而有了GROUPING SETS ,你的查询可以使用如下表达式:

SELECT D.CalendarYear, D.CalendarQuarter, T.SalesTerritoryCountry
  ,
SUM(F.SalesAmount) AS SalesAmount
FROM dbo.FactResellerSales F  
  
INNER JOIN dbo.DimTime D ON F.OrderDateKey = D.TimeKey
  
INNER JOIN dbo.DimSalesTerritory T ON
   F.SalesTerritoryKey
= T.SalesTerritoryKey
WHERE D.CalendarYear IN (2003,2004)
GROUP BY GROUPING SETS (
    (CalendarYear, CalendarQuarter, SalesTerritoryCountry)
  , (CalendarYear, CalendarQuarter)  
  , () )
ORDER BY D.CalendarYear, D.CalendarQuarter, T.SalesTerritoryCountry

  Country      
  Canada Mexico USA      

  
2007 Q1 1000 1000 5000 7000    
  
2007 Q2 1000 1000 6000 8000    
  
2007 Q3 1200 1300 7000 9500    
  
2007 Q4 1300 1400 8000 10700    
Grand Total:
35200  


GROUPING SETS 所提供的简洁性和性能优势随着可分组数目的增加,越发明显。

MERGE

MERGE 语句允许你在一个Transact-SQL 语句中对一个表或视图执行多个数据库操纵语言(DML)进行操作(INSERT、UPDATE和DELETE)。目标数据表或视图与一个数据源联接起来,这些DML操作将在该联接的结果之上执行。MERGE 语句有三个WHEN 条件子句,使你可以对结果集中的一个给定记录执行一个专门的DML动作:

对于同时存在于目标表和源表中的每一条记录,WHEN MATCHED 条件子句允许你对目标表中的给定记录执行UPDATE或DELETE操作。

对于存在于源表中而不存在于目标表中的每一条记录,WHEN [TARGET] NOT MATCHED 条件子句允许你将一条记录INSERT到目标表中。

对于存在于目标表中而不存在于源表中的每一条记录,WHEN SOURCE NOT MATCHED 条件子句允许你UPDATE 或DELETE 目标表中的给定记录。

你还可以对每一个WHEN条件子句指定一个搜索条件来选择要对记录执行哪种类型的DML操作。MERGE语句的OUTPUT条件子句包括一个新的虚拟字段,叫做$action,你可以使用它来标识对每一条记录所执行的DML操作。

在数据仓库环境中,MERGE 语句用来执行对缓慢变化维度(Slowly Changing Dimensions, SCD)有效的插入和删除操作以及在很多普通场景中维护事实数据表。比其运行单独的插入、更新和删除语句,MERGE 语句具有更高的性能,因为它只要求将数据传递过来。

SQL Server 2008还推出了一个针对插入语句的扩展功能,它允许插入语句使用嵌套INSERT、UPDATE、DELETE或MERGE 语句的OUTPUT 条件子句返回的记录。

假设你有一个DimBook表(ISBN、Price、IsCurrent),它用于跟踪一个书店中每一本书的历史价格和当前的价格。更改价格和添加新书是按周进行的,每星期会生成一个源表WeeklyChanges (ISBN、Price),这些更改会应用于DimBook 表。每一本新书都会插入一条记录。在这一周中价格有变化的现有书籍会以IsCurrent=0进行更新,并且会插入一条新记录以反映新价格。下面这个Transact-SQL 语句将使用新的MERGE和INSERT功能执行这些操作。

INSERT INTO DimBook(ISBN, Price, IsCurrent)
    
SELECT ISBN, Price, 1
    
FROM
    (
        MERGE DimBook
as book
        USING WeeklyChanges
AS src
        
ON (book.ISBN = src.ISBN and book.IsCurrent = 1)
        
WHEN MATCHED THEN
            
UPDATE SET book.IsCurrent = 0
        
WHEN NOT MATCHED THEN
            
INSERT VALUES (src.ISBN, src.Price, 1)
        OUTPUT $action, src.ISBN, src.Price
    )
AS Changes(action, ISBN, Price)
    
WHERE action = 'UPDATE';
0
相关文章