本文将展示SQL Server中的分区以及它们如何工作。
简介
数据库不断增长,然后由于性能问题,它们开始死亡。用户抱怨性能问题,然后一些DBA提到两个主要词来解决性能问题。分区和索引。
索引不在本文的讨论范围之内,我们今天的主角将是分区。什么是分区?在这篇文章中,我们将谈论在SQL Server中使用分区的几个地方,并将提供定义和概念。
分区可以应用于表、视图、索引,以及多维数据库的SSAS分区。如果你想看一下索引,我们也有一篇相当不错的文章给你。
什么是SQL Server中的分区?
当我们有一个大表时,有时需要花费太多的时间来获取查询中的数据。在查询中快速获得数据的关键之一是对表进行分区。分而治之或分而治之。这句归于马其顿的菲利普二世(亚历山大大帝的父亲)的话解释了分区的作用。想象一下,你有一本极长的书,要花太多的时间去寻找一个页面。即使有索引,索引也有100页。所以,为了解决这个问题,你把这本书分成小书,然后就更容易找到信息。
这就是我们在SQL Server(和其他数据库)中所做的。我们将表分割成更小的表,这样就更容易获得信息。
什么是表的分区?
让我们开始讨论分区表,我们有垂直分区和水平分区。
当你有一个BLOB列(带有图像、音频或其他类型文件的二进制大对象)时,通常使用垂直分区。在这种情况下,你想把所有的列放在一个表中,而把BLOB列放在另一个表中。这是因为与varchars或数字列相比,BLOB需要太多的资源,所以需要将它们分开。
另一方面,我们有水平分区,它更复杂。
水平分区将数据分为具有相同列名和数据类型的表。一个常见的情况是每个月有一个分区。每个表的分区存储了一年中某个月的数据。要创建一个水平分区,你需要为每个分区创建数据文件,然后将文件添加到数据库中,创建一个函数,将分区表的行映射到基于数值的分区中。我们还需要创建一个分区方案并映射分区。
如果你想详细了解如何创建水平和垂直表分区,我们这里有你需要的确切文章。
如果你想更深入地了解表的分区,我们有一篇关于如何自动化表分区的文章。
什么是应用于SQL Server视图的分区?
SQL Server也有分区视图的功能。你可以创建较小的表,而视图将包含每个表的UNION ALL,所以视图将像一个由多个表复合而成的大表。下面的代码是我的意思的一个例子。
创建 视图 dbo.LargePartitionedViewLargePartitionedView 与 schemabinding AS SELECT id, name, email FROM DBO.table1 UNION ALL SELECT id, name, email FROM DBO.table2 UNION ALL SELECT [id, name, email FROM DBO.table3 |
关于分区视图的更多步骤的解释,我们有一篇专门的文章可以帮助你。
什么是T-SQL查询中应用的分区?
在SQL Server中有一个SQL分区子句,它与表的分区或分区视图无关。这个子句用于聚合,它是group by子句的改进版。
例如,如果我想看到SUM,我们想看到每个ProductID的OrderQty的SUM,同时,我想看到SalesOrderID这样,我们会有一个错误。
SELECT SUM(OrderQty),ProductID,SalesOrderID FROM Sales.销售订单数据 GROUP BY ProductID |
错误信息是这样的。
Msg 8120, Level 16, State 1, Line 1
Column 'Sales.SalesOrderDetail.SalesOrderID' 在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。
当我们使用GROUP BY时,我们需要将所有未聚合的列纳入选择。另一方面,OVER(PARTITION BY)子句更加灵活,你可以包括其他列而不需要分组。
SELECT SUM(OrderQty) OVER(PARTITION BY ProductID) AS SUMOrderQty, 产品ID,销售订单ID FROM Sales.销售订单细节。 |
正如你所看到的,OVER PARTITION BY非常强大,允许创建灵活的聚合查询,并解决了GROUP BY子句的几个问题。

关于这个SQL语句的更详细的文章,我们这里有一篇非常有趣的文章。
什么是SSAS多维模型中的分区?
在SQL Server中的另一种类型的分区是在SQL Server分析服务模型中创建的分区。SQL Server为商业智能提供了一个多维模型。SSAS多维模型的一个简化定义是一个特殊的、快速的报告数据库。OLTP数据库对于报告来说并不那么有效,然后,多维模型是一个为报告设计的不同概念的数据库。
在SSAS中,我们有一些措施,这些措施是我们想要测量的值。例如,我们有一个销售的SSAS多维数据库,我们想测量总销售额和总收入。它们是SSAS中的措施。如果我们有太多的数据,我们将把总销售额分成每月、每周或其他标准的分区,把数据分成若干分区。
分区是在SSAS分析服务项目的立方体中创建的。你需要转到分区选项。
在查询中,在where子句中,我们通常定义分区的日期范围。通常情况下,分区是由日期分开的。
结语
在这篇文章中,我们展示了与SQL Server中的分区有关的不同问题。有数据库引擎中的表分区,分区视图,过度分区T-SQL子句,我们还谈到了SSAS的分区。如果这些解释都没有回答你的问题,欢迎在评论中写下你与分区有关的问题。

