Sql server SQL Server标准版中具有十亿行的分区

Sql server SQL Server标准版中具有十亿行的分区,sql-server,scalability,Sql Server,Scalability,hi想问一下如何对下表进行分区(见下文)。我遇到的问题不是通过聚集索引解决的历史记录检索。但是正如您所看到的,索引是基于HistoryParameterID然后是TimeStamp的,这是必需的,因为行的检索是基于上面所述的列 这里的问题是,每当它达到10亿条记录时,插入速度就会减慢,因为场景是每秒将插入15k行(注意这可能是30k-100k),每行对应一个HistoryParameterID 基本上,HistoryParameterID不是唯一的,它与下表中的其他列有一个->多个关系 我的直觉

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

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

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

我的直觉是,由于索引,它会减慢插入速度,因为插入并不总是在底部,因为它是按HistoryParameterID排列的

我使用时间戳作为索引进行了一些测试,但没有效果,因为查询性能是不可接受的

是否有任何方法可以通过历史参数对其进行分区?我试过了,所以我为分区视图创建了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

你需要的一切都在这里。我希望你能弄明白

对于标准版,存在替代解决方案,如答案

这也是一篇有趣的文章

我们还在企业自动化应用程序中实现了这一点,并围绕用户表定制了索引,效果很好

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

优点:

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

  • 实现路由方法和更新索引

  • 非集中式数据

我试过了,所以我为分区视图创建了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
如果使用分区视图路径(),我建议使用更少的表(少于100个)。如果没有分区表,优化器必须完成大量工作,因为视图的每个表都可以被不同的索引

如果HistoryParameterID是增量的,我不希望插入会随着表的大小而变慢。但是,在随机值的情况下,由于缓冲区缓存效率较低,随着表大小的增加,插入将逐渐变慢。单表、分区表或分区视图都会存在此问题。有关使用guid但问题适用于任何随机键值的示例,请参见


您可以尝试将SourceTimestamp单独用作聚集索引键的单个表,以及HistoryID和SourceTimestamp上的非聚集索引。这将提供最佳的插入性能,并且非聚集索引(可能包含列)对于您的select查询可能足够好。

嗨,问题是我只使用SQL SErver standard edition,企业上有分区表更新了问题,指定SQL Server standard edition是唯一的选择Hi TommyMore,感谢feedbak的研究。我希望分区视图可以做到这一点,但是创建15k联合,因为我将把它分解为15k个表。创建视图失败。有没有办法对上面的表进行分区,以便我的索引位于SourceTimeStamp上?是的,像我们实现分布式服务器或您选择的“表”一样实现并在应用程序中分离索引业务,然后根据SourceTimeStamp的自定义索引实现路由应用程序的请求。顺便说一句,HistoryParameterID不是增量的,因此基本上它是一个随机值,取决于场景0-15k、0-30k和0-100k。好的,那会有帮助吗?在插入性能中是否将SourceTimestamp作为HistoryId和SourceTimestamp上的聚集索引和非聚集索引?同时保持查询性能?那么我是否需要更改查询?由于目前是选择。。。。从HistoryParameterID=paramId和SourceTimeStamp>=startime和SourceTimeStamp的表中,仅SourceTimeStamp上的聚集索引将有助于插入性能。至于查询性能,如果查询请求,则需要额外的键查找来检索除SourceTimestamp和HistoryID之外的列。这将增加更多的开销,但我不能说性能是否足够。这在很大程度上取决于触摸和返回的行数。。。。从HistoryParameterID=paramId和SourceTimeStamp>=startime和SourceTimeStamp的表中,这是10亿行表大小的一小部分,因此我希望非聚集索引查找和键查找返回15K行。无论表大小如何,我都希望性能保持一致,最坏的情况是每次选择大约15K物理读取。这在很大程度上取决于磁盘子系统的性能。这不是数百万行吗?十亿行,分配给15k参数ID