web-dev-qa-db-ja.com

インメモリ一時列ストアを削除する方法

以下を検討してください。

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

4
Jeroen Mostert

最初に列ストアインデックスを削除する必要があるようです。これは私にとってはうまくいきます:

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

これは一時的な履歴テーブルを残すため、DROP TABLE A_History;を適切な方法で実行する必要があることに注意してください(これは、履歴テーブル名が指定されていない場合のデフォルトの命名です)。

5
Josh Darnell