首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于分区,该怎么处理

2012-05-05 
关于分区有几个关于分区的问题,希望大家帮忙了1. 表已经存在,能否再应运分区方案呢,如果可以,这么用?2. sq

关于分区
有几个关于分区的问题,希望大家帮忙了
1. 表已经存在,能否再应运分区方案呢,如果可以,这么用?
2. sqlserver里能否直接通过执行Select * into 表 from 表2时,也带上分区方案,如果能这样那是方便不过?



[解决办法]
网上的内容,看看对楼主有没有用

SQL code
为什么要进行分区?什么是分区?为什么要使用分区?简单的回答是:为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。通常,创建表是为了存储某种实体(例如客户或销售)的信息,并且每个表只具有描述该实体的属性。一个表对应一个实体是最容易设计和理解的,因此不需要优化这种表的性能、可伸缩性和可管理性,尤其是在表变大的情况下。大型表是由什么构成的呢?超大型数据库 (VLDB) 的大小以数百 GB 计算,甚至以 TB 计算,但这个术语不一定能够反映数据库中各个表的大小。大型数据库是指无法按照预期方式运行的数据库,或者运行成本或维护成本超出预定维护要求或预算要求的数据库。这些要求也适用于表;如果其他用户的活动或维护操作限制了数据的可用性,则可以认为表非常大。例如,如果性能严重下降,或者每天、每周甚至每个月的维护期间有两个小时无法访问数据,则可以认为销售表非常大。有些情况下,周期性的停机时间是可以接受的,但是通过更好的设计和分区实现,通常可以避免或最大程度地减少这种情况的发生。虽然术语 VLDB 仅适用于数据库,但对分区来说,了解表的大小更重要。除了大小之外,当表中的不同行集拥有不同的使用模式时,具有不同访问模式的表也可能会影响性能和可用性。尽管使用模式并不总是在变化(这也不是进行分区的必要条件),但在使用模式发生变化时,通过分区可以进一步改善管理、性能和可用性。还以销售表为例,当前月份的数据可能是可读写的,但以往月份的数据(通常占表数据的大部分)是只读的。在数据使用发生变化的类似情况下,或在维护成本随着在表中读写数据的次数增加而变得异常庞大的情况下,表响应用户请求的能力可能会受到影响。相应地,这也限制了服务器的可用性和可伸缩性。此外,如果以不同的方式使用大量数据集,则需要经常对静态数据执行维护操作。这可能会造成代价高昂的影响,例如性能问题、阻塞问题、备份(空间、时间和运营成本),还可能会对服务器的整体可伸缩性产生负面影响。分区可以带来什么帮助?当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分,从而提供一定的帮助。本文重点介绍横向分区,在横向分区中,大量的行组存储在多个相互独立的分区中。分区集的定义根据需要进行自定义、定义和管理。Microsoft SQL Server 2005 允许您根据特定的数据使用模式,使用定义的范围或列表对表进行分区。SQL Server 2005 还围绕新的表和索引结构设计了几种新功能,为分区表和索引的长期管理提供了大量的选项。此外,如果具有多个 CPU 的系统中存在一个大型表,则对该表进行分区可以通过并行操作获得更好的性能。通过对各个并行子集执行多项操作,可以改善在极大型数据集(例如数百万行)中执行大规模操作的性能。通过分区改善性能的例子可以从以前版本中的聚集看出。例如,除了聚集成一个大型表外,SQL Server 还可以分别处理各个分区,然后将各个分区的聚集结果再聚集起来。在 SQL Server 2005 中,连接大型数据集的查询可以通过分区直接受益;SQL Server 2000 支持对子集进行并行连接操作,但需要动态创建子集。在 SQL Server 2005 中,已分区为相同分区键和相同分区函数的相关表(如 Order 和 OrderDetails 表)被称为已对齐。当优化程序检测到两个已分区且已对齐的表连接在一起时,SQL Server 2005 可以先将同一分区中的数据连接起来,然后再将结果合并起来。这使 SQL Server 2005 可以更有效地使用具有多个 CPU 的计算机。sqlserver中创建表分区的流程 如下:1 要创建文件组,文件组中需要包含文件 所以还需要创建文件。(为了测试可以先只创建文件组,不创建文件 最后向表中插入数据的时候会报错,告知没有分配文件)。--创建文件组ALTER DATABASE test ADD FILEGROUP [fg1]ALTER DATABASE test ADD FILEGROUP [fg2]--为文件组添加文件ALTER DATABASE test ADD FILE( NAME = N'FG1', FILENAME = N'C:\test\FG1.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [fg1]ALTER DATABASE test ADD FILE( NAME = N'FG2', FILENAME = N'C:\test\FG2.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [fg2]--创建分区函数CREATE PARTITION FUNCTION test_partfunc (int)AS RANGE LEFT FOR VALUES (100)--创建分区架构CREATE PARTITION SCHEME test_partschemeAS PARTITION test_partfunc TO (fg1, fg2)--创建表,并指定分区CREATE TABLE students (StudentID int,StudentName nvarchar(100)) ON test_partscheme (StudentID)由此可见 创建分区架构以后,是可以多个表使用分区架构的。建立完毕以后可以向表中添加数据。添加完毕以后可以通过以下的sql语句查询每个分区中包涵的记录的条数和分区中最大的和最小的studentidSELECT $partition.test_partfunc(StudentID) [Partition Number], min(o.StudentID) AS [Min StudentID], max(o.StudentID) AS [Max StudentID], count(*) as [Rows In Partition]FROM students AS oGROUP BY $partition.test_partfunc(StudentID)ORDER BY [Partition Number]当然,其中还涉及到一个问题 就是很多时候我们会以日期来分区,这就导致分区一个一个都会使用,最后一个分区的数据会越来越大 假如我们的本意是想让一个分区就有一个月的数据 针对这种情况的数据。也有办法处理 详细的信息 大家可以看
[解决办法]
可以
1:刪除普通索引
2:刪除主健索引並轉為分區表
3:再恢復主健索引
4:恢復普通索引
[解决办法]
贴段2008的帮助文本,帮助了解下分区切换的概念

将数据分区可以快速、有效地管理和访问数据的子集,同时又能维护整个数据集合的完整性。可以使用 Transact-SQL ALTER TABLE...SWITCH 语句通过以下方式快速高效地转移数据子集:

将表作为分区分配到现有的已分区表。


将分区从一个已分区表切换到另一个已分区表。


重新分配一个分区以形成单个表。


如需了解有关分区切换概念的信息和查看实现分区切换的示例代码,请参阅 Readme_SlidingWindow。

切换分区的常规要求
在转移分区时,数据在物理上并未移动;只不过是有关数据位置的元数据有了改动。必须满足下面几项一般性的要求才能切换分区:

在 SWITCH 操作之前两个表必须都存在。在执行切换操作之前,从中移出该分区的表(源表)以及接收该分区的表(目标表)都必须存在于数据库中。


接收分区必须存在并且必须是空的。无论是将表作为分区添加到现有的已分区表,还是将分区从一个已分区表移动到另一个已分区表,接收新分区的分区都必须存在并且必须为空分区。


不分区的接收表必须存在且必须是空的。如果要重新分配一个分区以形成一个不分区的表,则接收新分区的表必须存在并且必须为空的不分区表。


各分区必须依据同一列。如果要将分区从一个已分区表切换到另一个已分区表,则这两个表必须依据同一列进行分区。


源表和目标表必须共享同一个文件组。ALTER TABLE...SWITCH 语句的源表和目标表必须位于同一文件组,并且其大值列也必须存储在同一文件组中。所有对应的索引、索引分区或索引视图分区也必须位于同一文件组中。不过,该文件组可以与对应表或其他对应索引的文件组不同。




有关定义了索引视图时的分区切换的信息,请参阅定义了索引视图时的分区切换。

表和索引的结构要求
除了上述一般性要求之外,源表和目标表必须具有相同的结构。结构要求如下:

源表和目标表必须具有相同的列结构和顺序。这两个表必须具有相同的列,并且列的名称、数据类型、长度、排序规则、精度、小数位数、为空性和 PRIMARY KEY 约束(如果有)都相同,这两个表还必须具有相同的 ANSI_NULLS 和 QUOTED IDENTIFIER 设置。另外,必须以相同的顺序定义列。不考虑 IDENTITY 属性。

注意: 
分区切换可在目标表的 IDENTITY 列中引入重复的值,并可导致源表的 IDENTITY 列值不连贯。使用 DBCC CHECKIDENT 检查表的标识值,并根据需要更改这些值。
 


分区依据列的为空性必须匹配。源表和目标表必须都为 NULL 或都为 NOT NULL。如果其中一个表没有进行分区,则与另一个表的分区依据列对应的列的为空性必须与已分区表的此列匹配。

重要提示: 
建议您对已分区表的分区依据列指定 NOT NULL。还建议您对作为 ALTER TABLE...SWITCH 操作的源或目标的不分区表指定 NOT NULL。当已分区列为 NOT NULL 时,则不会强制分区依据列的任何 CHECK 约束检查是否有 NULL 值。NULL 值通常置于已分区表最左侧的分区中。在切换最左侧分区以外的任何分区时以及在将 ANSI_NULLS 数据库选项设置为 ON 时,如果源表和目标表不存在 NOT NULL 约束,这可能会干扰同时对分区依据列定义的任何 CHECK 约束。
 


计算列必须具有相同的语法。如果其对应分区键是计算列,则定义其计算列的表达式的语法是相同的,而且计算列都是永久的。


ROWGUID 属性必须相同。任何定义有 ROWGUID 属性的列必须对应于另一个表中同样定义有 ROWGUID 属性的列。


XML 列必须具有相同的架构。必须将所有 xml 列按类型归入同一个 XML 架构集合。


所有 text、ntext 或 image 列的行内设置都必须相同。有关此设置的详细信息,请参阅行内数据。


表必须具有相同的聚集索引。源表和目标表必须具有相同的聚集索引,并且在切换分区之前不能禁用这些索引。


必须定义非聚集索引并且这些索引必须相同。如果对目标表定义了任何非聚集索引,则对源表也需要定义这些非聚集索引,并且这两个表的非聚集索引在每个索引键列的唯一性、子键和排序方向(ASC 或 DESC)方面的设计都应相同。禁用的非聚集索引没有此要求。



约束要求
若要移动分区,还必须满足下面的其他约束要求:

源和目标的 CHECK 约束必须完全匹配或前者的约束适用于后者的约束。如果对目标表定义了任何 CHECK 约束,则对源表也必须定义这些约束,并且,源表的这些约束需与目标表的相应约束完全匹配或适用于目标表的 CHECK 约束(例如,作为其子集)。


对 int 列的约束必须相同或存在子集关系。源表的 int 列的 CHECK 约束必须与目标表的 int 列的约束匹配或作为其子集存在。例如,如果目标表的 int 列 Column1 具有指定 Column1 < 100 的约束,则源表对应的列 Column1 必须具有同一约束或具有针对目标表中值的约束的子集,例如源表的约束可以为 Column1 < 90。指定多个列的 CHECK 约束必须使用相同的语法来定义。


不分区表必须与目标分区具有相同的约束。如果要将一个无分区表作为一个分区添加到一个现有已分区表,则必须对对应于目标表分区键的源表的列定义一个约束。这将确保值的范围在目标分区的边界值内。


源分区的边界值必须在目标分区的边界内。如果要将一个已分区表的某个分区切换到另一个已分区表,则源分区的边界值必须在目标分区的边界值内。如果边界值不适合,则必须对源表的分区键定义一个约束以确保表中的所有数据在目标分区的边界值内。

注意: 
在约束定义中避免数据类型转换。对作为分区切换的源表定义的且包含隐式或显式数据类型转换的约束可能会导致 ALTER TABLE...SWITCH 失败。
 


源表和目标表必须具有相同的 FOREIGN KEY 约束。如果目标表具有任何 FOREIGN KEY 约束,则对源表的相应列必须定义了相同的外键,并且这些外键引用的主键必须与目标表中的外键引用的主键相同。源表的外键不能标记为 is_not_trusted(可在 sys.foreign_keys 目录视图中查看),除非目标表的相应外键也标记为 is_not_trusted。有关此设置的详细信息,请参阅禁用索引准则。SQL Server 将对目标表的外键定义的所有 CASCADE 规则都应用到新移动的分区。



移动分区的额外要求
若要移动分区,还必须满足以下额外要求:

索引必须与表分区对齐。源表的所有索引必须与源表对齐,目标表的所有索引必须与目标表对齐。源表和目标表可以都分区,都不分区,或只有其中一个表分区。有关索引对齐的详细信息,请参阅已分区索引的特殊指导原则。


其他约束和要求适用于带索引视图的源表。如果 ALTER TABLE … SWITCH 语句中的目标表定义了索引视图,请参阅定义了索引视图时的分区切换以了解相关约束和示例。


允许没有全文索引。源表或目标表都可以没有全文索引。


允许目标表没有 XML 索引。在目标表可以没有 XML 索引。


在源表具有主键的情况下可以不定义主键/外键关系。在源表包含主键的情况下源表和目标表之间可以没有活动的主键/外键关系。


在目标表具有外键的情况下可以不定义主键/外键关系。在目标表包含外键的情况下源表和目标表之间可以没有活动的主键/外键关系。


另一个表的任何外键都不能引用源表。另一个表中的外键不能引用源表。


不允许对源表或目标表使用规则。不能对源表或目标表定义规则。可以对源表和目标表使用 CHECK 约束。

注意: 
规则是一个向后兼容的功能。优先考虑使用 CHECK 约束来实现。有关 CHECK 约束的限制,请参阅本主题前面的约束要求。
 


不得复制源表和目标表。源表和目标表都不能成为复制源。


在分区切换之前必须拥有所需的数据库权限。由于切换分区时使用的是 ALTER TABLE 语句,因此您必须拥有与 ALTER TABLE 语句关联的所需数据库权限。权限集在源表和目标表间不必相同。


移动分区时触发器必须处于非活动状态。移动表分区时不能激发 INSERT、UPDATE 或 DELETE 触发器或者级联操作,并且源表或目标表不需要具有在定义方面相似的触发器即可移动分区。

注意: 
在 ALTER TABLE…SWITCH 操作期间,源表和目标表都将获取一个架构修改锁,以确保在更改期间其他任何连接都无法引用这些表。有关锁的详细信息,请参阅锁模式。
 

热点排行