【问题标题】:How to partition table dynamically based on the number of rows in sql server?如何根据sql server中的行数动态分区表?
【发布时间】:2019-12-04 16:50:49
【问题描述】:

我正在做一些分析来对表进行分区。

这是表格

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[AnalysisMaster](
    [AnalysisMasterId] [bigint] NULL,
    [AnalysisDefinitionId] [bigint] NULL,
    [AnalysisDate] [date] NULL
) ON [PRIMARY]
GO



SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[AnalysisDefinition](
    [analysisid] [int] NOT NULL,
    [dataset] [int] NULL
) ON [PRIMARY]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[OutputData](
    [analysisid] [int] NOT NULL,
    [derivativeId] [int] NOT NULL,
    [metric] [int] NOT NULL,
    [value] [decimal](18, 0) NOT NULL,
    [metricdate] [date] NULL
) ON [PRIMARY]
GO

analysisId和derivativeId的组合是唯一的。

我希望对已有 100 亿行的现有表“OutputData”进行分区。 在 analysisId、derivativeId 上有一个聚集索引,并且有十几个使用这两列来查询数据的存储过程。

因此,我拥有的一个最安全的选择是使用“analysisId”对表进行分区。我遇到的所有 Microsoft 文档和博客都有基于日期/年份列的示例。如果我打算采取策略进行分区 基于行数的表说 10000000(1000 万),我该怎么做?所以最新的 1000 万个“analysisId”在最新的分区中。 partitionFunction 会是什么样子?我打算只在最新的分区上重建索引。我想要两个文件组,FG1(所有其他分区)和 FG2(最新分区)。

【问题讨论】:

    标签: sql sql-server-2017 database-partitioning


    【解决方案1】:

    做一个简单的分区函数并将边界设置为您的 analysisID 有什么问题吗?

    CREATE PARTITION FUNCTION PartFunc(INT)
    AS RANGE LEFT
    FOR VALUES(10000000, 20000000) ;
    

    这会给你 3 个分区,你的 1-10,000,000,然后是 10-20mil,然后是 20mil+

    【讨论】:

    • @dfundako- 谢谢你的回答。这给了我最后一个分区中的最大行数。因此,如果我有 100 亿行,这些行中的大多数都位于第三个分区中,并且对于选择查询和重建索引来说,它会成为一个巨大的分区。我想要一个完全相反的分区,称为“最新”分区,只有“n”行数和任何 n + 1,将“1”驱逐到倒数第二个分区。
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2010-12-10
    • 2019-09-29
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多