如何删除内存中的临时列存储

Jer*_*ert 4 sql-server columnstore memory-optimized-tables sql-server-2017

考虑以下:

CREATE DATABASE [Foo]
ALTER DATABASE [Foo] ADD FILEGROUP XTP CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE [Foo] ADD FILE (NAME=XTP,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\Bar_XTP') TO FILEGROUP XTP 
GO
USE [Foo]
CREATE TABLE dbo.A(
    ID INT NOT NULL CONSTRAINT PK_A_ID PRIMARY KEY NONCLUSTERED, 
    [Start] DATETIME2 GENERATED ALWAYS AS ROW START,
    [End] DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME([Start], [End]),
    INDEX IX_A_CCS CLUSTERED COLUMNSTORE
) WITH (
    MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA,  
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.A_History)
)
Run Code Online (Sandbox Code Playgroud)

这个奇妙的装置结合了 SQL Server 的所有新功能:内存中列存储,同时也是时态表。诚然,这方面的用例应该是有限的:内存中的列存储通常支持实时分析,并且不需要版本控制。即便如此,如果可能的话,毫无疑问有人会发现它有什么用处。

我只有一件小事有问题:我不知道如何摆脱它。一个简单的DROP TABLE产生:

消息 13552,级别 16,状态 1,第 27 行
删除表操作在表 'Foo.dbo.A' 上失败,因为它不是系统版本控制的临时表上的受支持操作。

这是意料之中的;对于基于磁盘的表,您会遇到相同的错误。您应该先关闭系统版本控制。不幸的是ALTER TABLE A SET (SYSTEM_VERSIONING = OFF)产生:

消息 10794,级别 16,状态 13,第 1 行
具有列存储索引的内存优化表不支持操作“ALTER TABLE”。

这也是意料之中的,但这似乎让我别无选择。从 Management Studio 中删除表会在幕后产生相同的命令序列,因此也会失败。

我四处搜索,但既没有找到解决方案,也没有找到尝试过相同方法并确认它是尚未解决的问题的人。解决方法很容易建议自己(比如将表重命名为一些晦涩的东西)但是有没有办法正确地删除它?

(这是在撰写本文时使用最新的非 Azure 版本的 SQL Server 进行测试的,即 14.0.3037.1,2017 RTM CU10。)

Jos*_*ell 6

看来您必须先删除列存储索引。这对我有用:

ALTER TABLE A DROP INDEX IX_A_CCS;
ALTER TABLE A SET (SYSTEM_VERSIONING = OFF);
DROP TABLE A;
Run Code Online (Sandbox Code Playgroud)

请注意,这会留下时间历史表,因此您可能希望运行DROP TABLE A_History;良好的度量(这是未指定历史表名称时的默认命名)。