【问题标题】:SSDT in Visual Studio 2017 and ColumnStore IndexVisual Studio 2017 中的 SSDT 和 ColumnStore 索引
【发布时间】:2018-02-28 21:23:08
【问题描述】:

在 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);

这两个create "index"命令好像不对,还有,为什么它引用了一列?

【问题讨论】:

    标签: sql-server visual-studio ssms sql-server-data-tools columnstore


    【解决方案1】:

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

    每个行存储索引必须至少引用一列,这就是为什么在生成的第一个 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);
    

    【讨论】:

      【解决方案2】:

      没关系。这不是问题。我的本地数据库版本不支持这个。目标做到了。该语句实际上是在创建一个约束,然后删除并再次创建它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多