[英]Partitioning in SQL Server 2005
我对分区和策略,如何以及何时使用它有一些疑问。 从SQL Server 2005中的分区表和索引可以理解, 分区不仅用于可管理性,而且还用于提高超大型数据库表(VLDB)的性能。 我们有一个包含数百万条记录的表。 该表存储性能数据,例如,单击指定的项目次数等等。 我们需要每天在实际应用中评估当月的数据。 我要防止的是仅出于性能原因将数据从一个表移动到另一个表。 我的想法是:我根据当年的月份在此VLDB上创建分区。 然后,我将在表和分区方案的日期字段上创建聚簇索引。 我不知道我是否正确理解它,但是我唯一的区别是,将为每个分区分别创建该索引。
通常,我的代码在开发阶段的样子。
/*
Maybe it looks like complicated, but instead of static upper bound,
I use function to determine end of the month for the current year.
So for example (executed in year 2009)
SELECT DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1901)*12)+1-1,31-1))
returns
2008-01-30 23:59:59.997
*/
CREATE PARTITION FUNCTION PartitionMonthlyCurrentYear(DATETIME) AS
RANGE LEFT FOR VALUES
(
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1901)*12)+1-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+1-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+2-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+3-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+4-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+5-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+6-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+7-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+8-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+9-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+10-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+11-1,31-1)),
DATEADD(ms, -2, DATEADD(month,((DATEPART(YEAR, GetDate())-1900)*12)+12-1,31-1))
);
/*
Create scheme on the primary file group. I'm aware about performance issues of this.
*/
CREATE PARTITION SCHEME SchemeMonthlyCurrentYear
AS PARTITION PartitionMonthlyCurrentYear
ALL TO ([PRIMARY]);
/*
Create clustered index on table and scheme
*/
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum] ON [dbo].[Log_Seiten_archiv]
(
[Datum] DESC
)ON SchemeMonthlyCurrentYear(Datum)
GO
我的问题:
问候安东·卡尔西克
您不能使用诸如getdate()之类的不确定函数来创建SQL Server分区函数。 如果您在数据库中填充了10年的数据,然后只是停止并看着SQL Server运行了几年,则随着日期的更改,您会看到SQL Server将该数据从一个分区移动到另一个分区。 SQL Server分区不能以这种方式工作。 当分区函数被调用时,数据被放置在一个特定的分区中,到此为止。 除非您要手动移动它,否则不会再次移动它。
要删除表上的分区,请应用不使用分区方案的新的聚集索引。 数据将被移动。 (请注意,这将需要很长时间,具体取决于数据大小和磁盘速度-对于一个数TB的数据仓库,如果不是几天,我们可能要聊几个小时。)
要分配其他分区功能,请使用新分区功能应用新的聚簇索引。 再一次,但是,如果您经常更改分区功能,则将需要很长时间来重建,而分区可能不是您要找的答案。
分区是对具有独立驱动器阵列集的超过1亿行数据库的绝佳解决方案,但听起来就像您将所有内容都放在同一组驱动器,同一文件组上一样。 您不会在那里看到大幅的性能提升。
另外,请注意,分区仅在SQL Server Enterprise Edition中可用,而在Standard中不可用。 它在Dev中可用,但是由于许可限制,您不能在生产中使用它。
谢谢你们的快速响应。
我现在了解了,如何删除或重新分配分区功能。
这里的例子:
在现有表上创建分区:
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily]
(
[Datum] DESC,
[kanzleinr] ASC
)ON SchemeDailyCurrentYear(Datum)
GO
在现有表上删除分区:
DROP INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily];
CREATE CLUSTERED INDEX [IX_Log_Seiten_archive_Datum_Kanzleinr] ON [dbo].[Log_Seiten_archiv_Daily]
(
[Datum] DESC,
[kanzleinr] ASC
)ON [PRIMARY]
GO
感谢您的帮助AKa
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.