在SQL Server Standard Edition中进行分区,包含数十亿行

时间:2014-12-16 00:21:44

标签: sql-server scalability

您想问一下如何对下表进行分区(见下文)。我遇到的问题不在于检索由聚簇索引解析的历史记录。但正如您所看到的,索引基于HistoryParameterID然后是TimeStamp,这是必需的,因为行的检索基于上述列。

这里的问题是,每当它达到~10亿条记录时,插入速度会减慢,因为场景将会有15k行\秒(注意这可能是30k - 100k)要插入,每行它对应一个HistoryParameterID。

基本上,HistoryParameterID不是唯一的,它有一个 - >许多关系与下表中的其他列一起发布。

我的预感是因为索引会减慢插入速度,因为插入并不总是在底部,因为它是由HistoryParameterID排列的。

我使用Timestamp作为索引进行了一些测试但由于查询性能不可接受而无济于事。

有没有办法按历史记录ParameterID对此进行分区?我正在尝试它,所以我创建了15k表分区视图。但是当我创建视图时,它并没有完成执行。有小费吗?或者有什么方法可以分区吗?请注意,我使用标准版并不能使用企业版。

CREATE TABLE [dbo].[HistorySampleValues]
(
    [HistoryParameterID] [int] NOT NULL,
    [SourceTimeStamp] [datetime2](7) NOT NULL,
    [ArchiveTimestamp] [datetime2](7) NOT NULL CONSTRAINT [DF__HistorySa__Archi__2A164134]  DEFAULT (getutcdate()),
    [ValueStatus] [int] NOT NULL,
    [ArchiveStatus] [int] NOT NULL,
    [IntegerValue] [bigint] SPARSE  NULL,
    [DoubleValue] [float] SPARSE  NULL,
    [StringValue] [varchar](100) SPARSE  NULL,
    [EnumNamedSetName] [varchar](100) SPARSE  NULL,
    [EnumNumericValue] [int] SPARSE  NULL,
    [EnumTextualValue] [varchar](256) SPARSE  NULL
) ON [PRIMARY]

CREATE CLUSTERED INDEX [Source_HistParameterID_Index] ON [dbo].[HistorySampleValues]
(
    [HistoryParameterID] ASC,
    [SourceTimeStamp] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

2 个答案:

答案 0 :(得分:2)

  

我正在尝试它,所以我创建了15k表用于分区视图。但当   我创建了它没有完成执行的视图。有小费吗?或者在那里   任何分区方式?请注意,我使用标准版和   使用企业版不是一种选择。

如果你沿着分区视图路径(http://technet.microsoft.com/en-us/library/ms190019.aspx)走下去,我会建议更少的表(不到一百个)。如果没有分区表,优化器必须经过大量工作,因为视图的每个表都可以以不同的方式编制索引。

如果HistoryParameterID是增量的话,我不希望插入速度随表大小而减慢。但是,在随机值的情况下,由于较低的缓冲区高速缓存效率,随着表大小的增加,插入将逐渐变慢。单个表,分区表或分区视图将存在该问题。有关使用guid的示例,请参阅http://www.dbdelta.com/improving-uniqueidentifier-performance/,但该问题适用于任何随机键值。

您可以尝试单独使用SourceTimestamp作为聚簇索引键的表,并使用HistoryID和SourceTimestamp上的非聚簇索引。这将提供最佳的插入性能,非聚集索引(可能包含列)可能足以满足您的选择查询。

答案 1 :(得分:0)

你需要的一切都在这里。我希望你能搞清楚。

http://msdn.microsoft.com/en-us/library/ms188730.aspx

并且对于标准版,存在类似this回答的替代解决方案。

this也是一篇有趣的文章。

我们在企业自动化应用程序中实现了这一点,并在用户表周围自定义索引,并且运行良好。

以下是自定义实施的缺点和优点:

优点:

  • 由于应用程序的逻辑感知,分区表的性能更高。

缺点:

  • 实施路由方法和更新索引。

  • 非集中数据。