SQL Server 的分区也使用过, 正常的操作是将数据库文件分散在不同的文件组中,然后不同的文件组分别置于不同的磁盘中以提升数据的查询效率.
打比方说,目前有3个文件组 A,B,C 每一个文件组都有一个独立的数据文件,且这三个文件组分别放置在磁盘: D,E,F中.
数据表是一张大表,按年份分了3个区(2001,2002,2003),分区应用于A,B,C三个文件组, 所以表分区,文件组,磁盘的对应关系就是:
Partition 2001 - File Group A - Disk D
Partition 2002 - File Group B - Disk E
Partition 2003 - File Group C - Disk F
问题1 - 如果我只查询 2001年的数据, SQL Server 是如何知道一定从 Partition 2001 中寻找? 或者说SQL Server 是如何知道要准确定位到哪一个分区去提取需要的数据?
问题2 - 如果同时查询了 2001年和2002年的数据, SQL Server 又是如何定位到两个区去查询数据? 是并行查询数据以提高查询效率还是依次提取数据?
问题3 - 系统是如何做到提高查询效率的, 因为按照我的理解, 不管是查哪一年的数据, 都是到对应的文件组 A, B, C中查, 虽然文件组分布在不同的磁盘D,E,F中,但是D,E,F 仅仅是逻辑磁盘. 如果同时查询这几年的数据, 对于磁盘的寻道时间来说它们都是作用于同一个硬盘,即物理磁盘上. 很显然 D,E,F不是不同的物理磁盘,这种分区是如何实现3个查询同时到各自的磁盘上去查数据以提高查询效率的. 我这样问的依据是我经常看到类似于这样的说法:"SQL Server 2005引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能" 但很明显我上述提到的文件组虽然位于不同的磁盘,但是这些都不是物理磁盘,物理磁盘就只有一个,它们都是基于同一个物理磁盘的不同的逻辑磁盘.
问题4 - 想到之前我们有将10个以上的文件组分布在两个不同的磁盘比如 E,F中. 这样每一个磁盘就支持了5个文件组, 每一个文件组有独立的表分区数据. 尽管如此,基于问题2, 不管每个磁盘有几个文件组,所有的磁盘都是基于同一个物理磁盘的不同逻辑磁盘. 所以,我理解的是不管每一个磁盘放几个文件组,或者把所有文件组放在一个逻辑磁盘中,它们都不是将数据分散到了不同的物理磁盘中,也就是说做不到并行处理,又如何提高查询性能?
再这么想下去就是分不分区就没有什么用了,反正都是在一个物理磁盘上跑数据.
希望有理解这个原理的朋友们给与纠正与提示.
没有合适的答案,我自己查资料自己解决吧!
1. http://msdn.microsoft.com/zh-cn/library/ms345599(v=sql.100).aspx MSDN的这篇文章可以回答 第1个问题和第2个问题. 原理在于如果我们的查询条件中如果包含了分区列的话,SQL Server 会首先很容易找到需要的数据是在哪一个分区, 从而定位到具体的数据集. 我虽然知道SQL Server会判断使用哪一个分区的数据,但是更希望明白其中的过程, 这个帖子可以帮忙理解.
2. 对于问题3和问题4, 我理解的还是如果我们所有的测试案例都是基于同一个物理硬盘,并且这个硬盘仅有一个磁头读取数据的话,那么我们的分区对于'并行处理性能' 我认为是没有任何提高的. 因为从原理上说基于同一个硬盘,是无法做到并行读取的. 所以很多写分区表帖子中开篇就提到"SQL Server 2005引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能" ,但是转身就使用了同一个磁盘作为分区的例子, 我认为这两者说的就是矛盾的. 在我学习表分区的时候,我一直没能弄明白的就是同一个磁盘上放了分区后的多个文件组到底是如何提高磁盘的并行能力的呢?
我认为,如果服务器上有多个硬盘的情况下,这种说法才算成立. 如果服务器上只有一个物理硬盘的情况下,就不能说分区可以提高磁盘的并行处理性能. 那么在一个物理硬盘的情况下分区,到底有什么样的好处,我觉得有这么几点:
1. 减少数据查询体积, 就像MSDN帖子中讲的查询数据的过程,很明显看到查询数据体积的减小,从这个角度上来说是可以提高查询性能的. 以前是要扫描100W条数据找数据,现在能够定位到分区后可能只需要扫描10W条数据,查询体积的减少对性能提升来说应该是有很大帮助的.
2. 有时一个磁盘的空间大小有限,比如服务器上有5个磁盘, 每个磁盘大小都是100G. 将文件组放到一个磁盘,如果数据量增长很快,可能会爆盘. 如果将分区后的文件组按实际需要放在不同的磁盘上, 比如递增的历史数据,系统数据文件, 实时增长的数据 等等把它们归于不同的文件组并分配在不同的磁盘上的话,合理的控制数据的增长,不会轻易报盘.
3. 一个100G的大表在数据库中备份要花多少时间,并且这100G中可能只有10G的数据在一定时间里经常改变,那么通过分区,以后可能只需要对这10G数据所在的文件组进行部分备份就可以了,这也是分区的好处.
目前就想了这么多了..我觉得我自己的这些理解可以回答我自己提出的问题了.
简单总结,基于多个物理硬盘的表分区有可能会提升并行查询性能. 但是基于物理硬盘的表分区于并行查询好像没有什么关系,但是可以减少表的查询体积也提高了查询性能,并在备份,文件组管理上有比较不错的优势.
留位学习
SQL Server 引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能……有说到是要物理磁盘。
分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的。
另外:
http://book.51cto.com/art/200708/53938.htm
关注下,学习。
概念上是这样理解没有错. 所以我的问题就是我们现在很多的例子都是基于一个物理磁盘上的多个逻辑磁盘, 而并非多个物理磁盘形成的一个逻辑磁盘.
如果是一个物理磁盘上的多个逻辑磁盘,那么文件组放到哪里本质上都是在一个物理磁盘上读取,也就不存在并行处理了.
像你提到的通过分区将数据分为更小,更易管理的部分. 管理上在切换分区数据 Partition Switch 时确实比较方便,但是不管怎么分都是同一个物理磁盘的情况下是如何做到提升性能的呢?
1.数据库引擎能够判定查询过程中应该访问哪个分区,而不用扫描整个表
2.如果查询需要的数据行分散在多个分区中,SQL Server使用多个处理器对多个分区进行并行查询