Sql-Server
如何刪除記憶體中的臨時列儲存
考慮以下:
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;
良好的度量(這是未指定歷史表名稱時的預設命名)。