日期:2014-05-18  浏览次数:20682 次

SQL SERVER 分割表如何实现?
网上看到如果SQL中一个表行数很大可以横向分割,如果是列数很大那么可以纵向分割,如果是SQL2005的话还可以用分区表,分区存放表中的某些列。请问SQL如果实现横向分割、纵向分割、如果实现分区表存放表中不同的列?

------解决方案--------------------
将数据库分区可提高其性能并易于维护。如果将大型表拆分为多个较小的表,则只访问部分数据的查询可以更快地运行,因为要扫描的数据变得更少。维护任务(例如,重新生成索引或备份表)也可以更快地运行。

可以在不通过将表物理放置在多个磁盘驱动器上来拆分表的情况下获取分区。如果将某个表放置在一个物理驱动器上,将相关表放置在另一个驱动器上,则可以提高查询性能,因为当运行涉及表间联接的查询时,多个磁盘头同时读取数据。可以使用 SQL Server 文件组来指定放置表的磁盘。

 硬件分区
硬件分区将数据库设计为利用可用的硬件体系结构。以下是硬件分区示例:

可以执行多线程操作的多处理器,使得可以同时运行许多查询。换句话说,在多处理器上可以同时运行查询的各个组件,因此使单个查询的速度更快。例如,查询内引用的每个表可以同时由不同的线程扫描。

RAID(独立磁盘冗余阵列)设备使得数据在多个磁盘驱动器中条带化,使更多的读写磁头同时读取数据,因此可以更快地访问数据。在多个驱动器中条带化的表通常比存储在单个驱动器上的相同的表扫描速度要快。换句话说,将表与相关的表分开存储在不同的驱动器上可以显著提高联接那些表的查询的性能。有关详细信息,请参阅RAID。

 水平分区
水平分区将表分为多个表。这样,每个表包含的列数相同,但是行更少。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月的数据的查询都只引用相应的表。

具体如何将表进行水平分区取决于如何分析数据。您应将表进行分区,以便查询引用的表尽可能少。否则,查询时需要使用过多的 UNION 查询来逻辑合并表,这会影响查询性能。有关查询水平分区的表的详细信息,请参阅使用视图的情况。

常用的方法是根据时期和使用对数据进行水平分区。例如,一个表可能包含最近五年的数据,但是只定期访问本年度的数据。在这种情况下,可考虑将数据分区成五个表,每个表只包含一年的数据。

有关详细信息,请参阅已分区表和已分区索引。

 垂直分区
垂直分区将一个表分为多个表,每个表包含较少的列。垂直分区包括两种类型,即规范化和行拆分:

规范化是标准的数据库进程,它删除表中的多余列,并将这些列放置在通过主键和外键关系链接到主表的辅助表中。

行拆分将原始表垂直分成多个只包含较少列的表。拆分表内的每个逻辑行都与其他表内由 UNIQUE KEY 列(在所有已分区表中都相同)标识的相同逻辑行相匹配。例如,联接每个拆分表内具有 ID 712 的行将重新创建原始行。

与水平分区一样,垂直分区使得查询需要扫描的数据变少了。这将提高查询性能。例如,某个表包含七列,通常只引用该表的前四列,那么将该表的后三列拆分到一个单独的表中将有利于提高性能。

应该慎用垂直分区,因为分析多个分区中的数据时需要联接表的查询。如果分区过大,垂直分区还可能会影响性能。