繁体   English   中英

在SQL Server 2005中进行分区

[英]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

我的问题:

  1. 您如何看待这种方法?
  2. 如何从指定的分区方案中删除表? 如果删除索引,仍然不能删除方案和功能,因为仍然依赖于表Log_Seiten_archiv
  3. 如何分配表以使用不同的分区功能? 由于开发的原因,我经常需要更改定义分区功能的方式或创建新分区。 如何为现有表格执行此操作? 例如,我想更改以前显示的功能的年份。

问候安东·卡尔西克

  1. 您不能使用诸如getdate()之类的不确定函数来创建SQL Server分区函数。 如果您在数据库中填充了10年的数据,然后只是停止并看着SQL Server运行了几年,则随着日期的更改,您会看到SQL Server将该数据从一个分区移动到另一个分区。 SQL Server分区不能以这种方式工作。 当分区函数被调用时,数据被放置在一个特定的分区中,到此为止。 除非您要手动移动它,否则不会再次移动它。

  2. 要删除表上的分区,请应用不使用分区方案的新的聚集索引。 数据将被移动。 (请注意,这将需要很长时间,具体取决于数据大小和磁盘速度-对于一个数TB的数据仓库,如果不是几天,我们可能要聊几个小时。)

  3. 要分配其他分区功能,请使用新分区功能应用新的聚簇索引。 再一次,但是,如果您经常更改分区功能,则将需要很长时间来重建,而分区可能不是您要找的答案。

分区是对具有独立驱动器阵列集的超过1亿行数据库的绝佳解决方案,但听起来就像您将所有内容都放在同一组驱动器,同一文件组上一样。 您不会在那里看到大幅的性能提升。

另外,请注意,分区仅在SQL Server Enterprise Edition中可用,而在Standard中不可用。 它在Dev中可用,但是由于许可限制,您不能在生产中使用它。

谢谢你们的快速响应。

  1. 您确实对开发人员负责如何将数据传输到分区表中负责。 有许多方法可以做到这一点,每种方法都有其优点和缺点。 我在Technet上找到了关于此的出色文章。

我现在了解了,如何删除或重新分配分区功能。

这里的例子:

在现有表上创建分区:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM