SQL SERVER 分区

摘要:
要将索引与其基表对齐,它不需要参与与基表相同的命名分区函数。然而,索引和基表的分区函数必须本质上相同,即1)分区函数的参数具有相同的数据类型;2) 分区函数定义相同数量的分区;3) 分区函数为分区定义相同的边界值

“索引要与其基表对齐,并不需要与基表参与相同的命名分区函数。但是,索引和基表的分区函数在实质上必须相同,即:

1) 分区函数的参数具有相同的数据类型;

2) 分区函数定义了相同数目的分区;

3) 分区函数为分区定义了相同的边界值。”

“先设计一个已分区表,然后为该表创建索引。执行此操作时,SQL Server 将使用与该表相同的分区方案和分区依据列自动对索引进行分区。因此,索引的分区方式实质上与表的分区方式相同。这将使索引与表“对齐”。

如果在创建时指定了不同的分区方案或单独的文件组来存储索引,则 SQL Server 不会将索引与表对齐。“

数据库结构和索引的是否合理在很大程度上影响了数据库的性能,但是随着数据库信息负载的增大,对数据库的性能也发生了很大的影响。可能我们的数据库在一开始有着很高的性能,但是随着数据存储量的急速增长—例如订单数据—数据的性能也受到了极大的影响,一个很明显的结果就是查询的反应会非常慢。在这个时候,除了你可以优化索引及查询外,你还可以做什么?建立分区表(Table Partition)可以在某些场合下提高数据库的性能,在SQL Server 2005中也可以通过SQL语句来创建表分区,但在SQL Server 2008中提供了向导形式来创建分区表。本文介绍了如何来创建分区表。

什么是分区表?

分区表是把数据按某种标准划分成区域存储在不同的文件组中,使用分区可以快速而有效地管理和访问数据子集,从而使大型表或索引更易于管理。合理的使用分区会很大程度上提高数据库的性能。已分区表和已分区索引的数据划分为分布于一个数据库中多个文件组的单元。数据是按水平方式分区的,因此多组行映射到单个的分区。已分区表和已分区索引支持与设计和查询标准表和索引相关的所有属性和功能,包括约束、默认值、标识和时间戳值以及触发器。因为分区表的本质是把符合不同标准的数据子集存储在一个数据库的一个或多个文件组中,通过元数据来表述数据存储逻辑地址。

决定是否实现分区主要取决于表当前的大小或将来的大小、如何使用表以及对表执行用户查询和维护操作的完善程度。通常,如果某个大型表同时满足下列两个条件,则可能适于进行分区:

  • 该表包含(或将包含)以多种不同方式使用的大量数据。
  • 不能按预期对表执行查询或更新,或维护开销超过了预定义的维护期。

例如,如果对当前月份的数据主要执行 INSERT、UPDATE、DELETE 和 MERGE 操作,而对以前月份的数据主要执行 SELECT 查询,则按月份对表进行分区可能会使表的管理工作更容易一些。如果对表的常规维护操作只针对一个数据子集,那么此优点尤为明显。如果该表没有分区,那么就需要对整个数据集执行这些操作,这样就会消耗大量资源。例如,通过分区,可以针对具有只写数据的单个月份执行类似索引重新生成和碎片整理的维护操作,而只读数据仍可用于联机访问。

Transact-SQL ALTER TABLE...SWITCH 语句还可以快速有效地移动数据子集。这也提供了很好的便利,让我们可以放心的对数据表进行全面的维护。

怎么建立分区表?

创建分区表分为以下几个步骤:

  1. 创建分区函数以指定如何分区使用该函数的表。(T-SQL: CREATE PARTITION FUNCTION)
  2. 创建分区方案以指定分区函数的分区在文件组上的位置。(T-SQL: CREATE PARTITION SCHEMA)
  3. 创建使用分区方案的表。

以下步骤演示了如何在SQL Server 2008 Management Studio中通过向导完成创建分区表的过程。当然,你也可以通过脚本来完成这些功能。

  1. 在SQL Server 2008 Management Studio中选择你想要创建分区表的对象,右键点击表名选择Storage –> Create Partition.
  2. 在出现的Create Partition Wizard中点击Next按钮进入Select  a Partition Column页面。
  3. 在Select a Partition Column页面设置基于哪个字段进行数据子集划分。在这里我们选择EndDate。在后边会对EndDate设置条件来划分数据子集。

             

  1. 在Select a Partition Function页面输入一个名字来作为Function的名称。这里我们输入YearOrderPartitionFunction
  2. 下一步是给创建的分区方案命名。在Select a Partition Schema页面输入YearOrderPartition作为名称。
  3. 在Map Partition页面上我们设置分区标准。Left Boundary和Right Boundary是指符合区分标准的数据被放置到那个数据子集,对应<=和<.
  4. 点击Set Boundaries来设置基于EndDate的数据子集划分标准。

    

  1. 点击Estimate storage来估算每个数据子集的空间大小和其数据条目。根据设定的从2001-01-01到2004-12-31为止的所有数据按年划分的标准,我们最终得到了5个数据子集和一个用来存放最新数据的子集。这个新的数据子集对任何分区都是必须的,每个分区表中都会含有这个新的数据子集用来存放不同于数据标准划分的所有子集的数据(在这里就是大于2005年1月1日的订单)。

    

  1. 接下来通过选择以哪种方式运行(Run Immediately或者Schedule或者Script)来结束向导。分区表创建完成。

创建表分区完成了,接下来你可以享受表分区带给我们的优越性了(如果你的选择是正确的话),你还可以针对各个数据子集来进行合并、删除、移动等。通过这些你可以很好的维护数据库。在以后的post中我们会接下来介绍如何使用分区表。

免责声明:文章转载自《SQL SERVER 分区》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue+element+upload实现头像上传Nuxt.js端口冲突 Nuxt.js 如何更改端口配置?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Lucene 全文检索引擎

Apache Lucene PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语。那小博猪就简单介绍一下这一周的学习历程, 仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也不用打马赛克了,都是网络分享的开源资料,当然也不涉及任何利益关系。 Lucene是apache软件基金会4 jakarta项目...

[MySQL] 常用SQL的优化--18.4

  这里介绍下,Insert、Group By等SQL语句的优化方法: 1、大批量数据插入当load命令导入数据的时候,可以进行适当的设置提高导入速度。 1.1 对于MyISAM表,可以先禁用非唯一索引更新,再导入数据来快速导入大量的数据。   alter table table_name disable keys;   load date infile...

Atitit mysql redis mongodb 性能指标 目录 1.1. 二、 性能比较 1 1.2. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s 2 1

Atitit mysql redis mongodb 性能指标   目录 1.1. 二、 性能比较 1 1.2. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s 2 1.3. Mysql单表数据量达到5-10G时会出现明细的性能降级 2 1.4. Mongodb 最起码是插入速度是mysql俩倍数 2 1.5. 查询速度就...

foreign key constraint fails错误的原因

建表:CREATE TABLE Course ( Cno Char(4) PRIMARY KEY, Cname Char(40), Cpno Char(4), Ccredit Int, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );插入数据:INSERT INTO Course VALUES('1'...

[转] oracle 监听

oracle 监听 启动监听:lsnrctl start 查看监听:lsnrctl status 停止监听:lsnrctl stop 1、oracle 数据服务器包括:实例进程和数据库;    实例进程包括:memory structure(sga)以及background process(pmon(进程监控)、smon(系统监控system monito...

关于mongodb当中的数据导入到mysql数据。

昨天有人问题mongodb的数据怎么导入到mysql关系型数据库,当时真不知道。今天查询了资料,然后自己实践了一下。在这里记录一下: 这里用到MongoDB的mongoexport,这个功能是将mongodb的数据导成csv文件,然后再讲csv文件当中的数据加载到mysql数据库,实现将mongdb数据库的数据导入到myql当中。 mongoexport...