Sql-Server

如何刪除記憶體中的臨時列儲存

  • August 30, 2018

考慮以下:

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

這個奇妙的裝置結合了 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。)

看來您必須先刪除列儲存索引。這對我有用:

ALTER TABLE A DROP INDEX IX_A_CCS;
ALTER TABLE A SET (SYSTEM_VERSIONING = OFF);
DROP TABLE A;

請注意,這會留下時間歷史表,因此您可能希望執行DROP TABLE A_History;良好的度量(這是未指定歷史表名稱時的預設命名)。

引用自:https://dba.stackexchange.com/questions/216316