Visual Studio 2017中的SSDT和ColumnStore索引

问题描述 投票:0回答:2

在SSDT中,我有一个表和列存储索引定义为:

CREATE TABLE [dbo].[FactBillPayTransaction] (
    [NaturalKeyText]                     NVARCHAR (500)  NOT NULL,
    [RecordEffectiveDateTime]            DATETIME2 (7)   NOT NULL,
    [SourceEffectiveUTCDateTime]         DATETIME2 (7)   NOT NULL,
    [InsertJobRunSequenceNumber]         BIGINT          NOT NULL,
    [LatestUpdateJobRunSequenceNumber]   BIGINT          NOT NULL,
    [InsertDateTime]                     DATETIME2 (7)   NOT NULL,
    [LatestUpdateDateTime]               DATETIME2 (7)   NOT NULL,
    [DeleteDateTime]                     DATETIME2 (7)   NULL,
    [ChangeControlChecksum]              NVARCHAR (32)   NOT NULL,
    .......More Columns
);
GO
CREATE CLUSTERED COLUMNSTORE INDEX [ci_cs_FactBillPayTransaction]
    ON [dbo].[FactBillPayTransaction];

When I generate scripts i get the following for SQL Server 2014:

CREATE TABLE [dbo].[FactBillPayTransaction] (
    [NaturalKeyText]                     NVARCHAR (500)  NOT NULL,
    [RecordEffectiveDateTime]            DATETIME2 (7)   NOT NULL,
    [SourceEffectiveUTCDateTime]         DATETIME2 (7)   NOT NULL,
    [InsertJobRunSequenceNumber]         BIGINT          NOT NULL,
    [LatestUpdateJobRunSequenceNumber]   BIGINT          NOT NULL,
    [InsertDateTime]                     DATETIME2 (7)   NOT NULL,
    [LatestUpdateDateTime]               DATETIME2 (7)   NOT NULL,
    [DeleteDateTime]                     DATETIME2 (7)   NULL,
    [ChangeControlChecksum]              NVARCHAR (32)   NOT NULL,
    .......More Columns   
);

CREATE CLUSTERED INDEX [ci_cs_FactBillPayTransaction]
    ON [dbo].[FactBillPayTransaction]([NaturalKeyText]);

CREATE CLUSTERED COLUMNSTORE INDEX [ci_cs_FactBillPayTransaction]
    ON [dbo].[FactBillPayTransaction] WITH (DROP_EXISTING = ON);

这两个创建“索引”命令似乎不正确,为什么它有一个列的引用?

sql-server visual-studio ssms sql-server-data-tools columnstore
2个回答
1
投票

这必须是产品缺陷,但最终结果仍然是正确的。

每个rowstore索引必须至少引用一列,这就是您在生成的第一个CREATE CLUSTERED INDEX语句中引用一列的原因。

生成CREATE CLUSTERED INDEX的最可能原因在于partitioning requirements of columnstore indexes:数据必须是分区对齐的,因此首先需要在分区方案上创建聚簇索引(将每一行分配给它的分区)然后你需要使用DROP_EXISTING=TRUE子句创建具有相同分区方案的聚簇列存储索引。因此,如果您有一个分区表,那么语法将如下所示:

CREATE CLUSTERED INDEX [ci_cs_FactBillPayTransaction]
    ON [dbo].[FactBillPayTransaction]([NaturalKeyText])
    ON COLUMNSTORE_PARTITION_SCHEME (NaturalKeyText);

CREATE CLUSTERED COLUMNSTORE INDEX [ci_cs_FactBillPayTransaction]
    ON [dbo].[FactBillPayTransaction] WITH (DROP_EXISTING = ON)
    ON COLUMNSTORE_PARTITION_SCHEME (NaturalKeyText);

0
投票

没关系。这不是问题。我的本地数据库版本不支持此功能。目标确实如此。这个陈述实际上做的是创建一个约束,然后再次删除并创建它。

© www.soinside.com 2019 - 2024. All rights reserved.