设为首页 收藏本站
查看: 859|回复: 0

[经验分享] MS Sql Server 2005 分区表有点麻烦

[复制链接]

尚未签到

发表于 2016-11-5 06:15:58 | 显示全部楼层 |阅读模式
ALTER DATABASE AdventureWorks ADD FILEGROUP [2003Q3]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  



创建文件组后,使用 ALTER DATABASE 将文件添加到该文件组中。  

ALTER DATABASE AdventureWorks
ADD FILE
(NAME = N'2003Q3',
FILENAME = N'C:\AdventureWorks\2003Q3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP [2003Q3]  


  
  确定是否应使用多个文件组
  为了有助于优化性能和维护,应使用文件组分离数据。文件组的数目一定程度上由硬件资源决定:一般情况下,文件组数最好与分区数相同,并且这些文件组通常位于不同的磁盘上。但是,这主要适用于打算对整个数据集进行分析的系统。如果您有多个 CPU,SQL Server 则可以并行处理多个分区,从而大大缩短处理大量复杂报表和分析的总体时间。这种情况下,可以获得并行处理以及在分区表中移入和移出分区的好处。
  
  
  边上的同事说文件组包含多个文件可以增加并行度,也就是多个CPU可以一起读?
他的意思难道是说操作系统对程序访问单个文件有限制,多了话会阻塞?
如果是的话 Windows 2003 64位 企业版 文件有大小限制 有并行访问的限制不?
他还说可以把它们分配到不同磁盘上。不过如今都用Raid 10了 不需要人为的分成多个文件,反而增加维护复杂度。
他接着说 文件小而多比大而少 容易备份!
他说的是真的吗?

  因此本人还是采用一个文件组和一个文件.其实就是用原来的数据文件的.
  建立分区函数
  CREATE PARTITION FUNCTION FuPart_szumevent(datetime)AS RANGE RIGHT FOR VALUES ('20070801','20070901','20071001','20071101','20071201','20080101','20080201','20080301','20080401','20080501','20080601','20080701','20080801','20080901','20081001','20081101','20081201')
这里采用的是范围分区。 这里有个Right 和Left。Right比较容易理解 它是小于时间点的是另外个分区数据,大于和等于它的是所在的分区。
  A<Time1<=B<Time2<=C 而Left是反过来 A>=Time1>B>=Time2>C
  Left 有个麻烦点是 >=Time1 => 2008-01-01 23:59:59.997
  
  建立分区架构:
  CREATE PARTITION SCHEME FNw_szumevent AS PARTITION FuPart_szumevent ALL TO ([PRIMARY])
  其实就是关联东东,或许Ms认为以后DBA会对分区表进行改用分区函数

  建立分区表:
CREATE TABLE [dbo].[Part_SzumEvent](
[id] [uniqueidentifier] NOT NULL,
[fid] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[show_color] [nvarchar](64) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Part_SzumEvent] PRIMARY KEY NONCLUSTERED
([id] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] --关键字使用文件组
) ON [FNw_szumevent]([start_case_time])--挂接分区架构和分区列
  
  从旧表插入3万多数据
  insert into Part_SzumEvent select * from szum_event --32855
  报错:消息 8101,级别 16,状态 1,第 1 行 An explicit value for the identity column in table 'Part_SzumEventA'
can only be specified when a column list is used and IDENTITY_INSERT is ON.
  
  然后去修改这列,取消该自动增量 “Part_SzumEventA”表 - 无法修改表。 Incorrect syntax near the keyword 'DEFAULT' 没办法只好删除它 插入后重建
  
  建立聚集分区索引
CREATE CLUSTERED INDEX [Idx_SE_StaTime] ON [dbo].[Part_SzumEvent]
( [start_case_time] ASC )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [FNw_szumevent]([start_case_time])
  
查看分区情况
select
partition = $partition.FuPart_szumevent(start_case_time) ,
rows = count(*) ,
minval = min(start_case_time),
maxval = max(start_case_time)
from dbo.Part_SzumEvent
group by $partition.FuPart_szumevent(start_case_time)
order by partition
  
  
  查看实际性能
select * from szum_event where start_case_time <= convert(smalldatetime,'2007-09-01')
计划为访问关键字的聚集索引 IO 2.18 CPU 0.036 实际行数为42 估计行数142
最后的Select 子树大小 2.2164 并行度 1 估计行数 142.9
  
  select * from Part_szumevent where start_case_time <= convert(smalldatetime,'2007-09-01')
计划为访问Idx_SE_StaTime的聚集索引 计划比较多步 要经过计算标量,常量扫描,嵌套循环
io 0.00046 cpu 0.0003078 实际行数为42 估计行数41.9
最后的Select 子树大小 0.015272 并行度 1 估计行数 125.8
  
另外可以参考下: 本人成功地在旧表通过删除再建立聚集索引来解决了 哈哈
将无分区表转换为已分区表
可以通过以下两种方式之一将现有的无分区表转变为已分区表。
  一种方式是通过使用 CREATE INDEX 语句对表创建已分区聚集索引。此操作类似于对任一表创建聚集索引,因为 SQL Server 实质上将删除表并以聚集索引格式重新创建该表。如果已经对表应用了某个已分区聚集索引,则可以使用带有 DROP EXISTING = ON 子句的 CREATE INDEX 删除该索引并以某种分区方案重新生成该索引。
  有关聚集索引的信息,请参阅聚集索引设计指南。
  另一种方式是使用 Transact-SQL ALTER TABLE SWITCH 语句将表中的数据切换到只有一个分区的按范围分区的表中。此已分区表在转换发生之前必须已经存在,并且该表的单个分区必须为空。有关切换分区的详细信息,请参阅使用分区切换高效传输数据。将表修改为已分区表之后,可以修改其分区函数以增加分区,如前面修改分区函数中所述。
  将现有表转换为已分区表
  CREATE INDEX (Transact-SQL)
  ALTER TABLE (Transact-SQL)
  将已分区表转换为无分区表
将已分区表更改为无分区表仅涉及到修改已分区表的分区函数,以使该表仅由一个分区组成。尽管这从技术上说仍然是已分区表,但此状态与要对该表执行的任何后续操作不相干。
  如果已经对表应用了已分区聚集索引,则可以通过删除该索引并将其作为无分区索引重新生成来获得相同的结果。可使用带有 DROP EXISTING = ON 子句的 Transact-SQL CREATE INDEX 命令来执行此操作。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295851-1-1.html 上篇帖子: 在SQL SERVER 2005/2008中拥有一个对象 下篇帖子: SQL Server 2000 联机丛书可用性评估报告
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表