3

SQL Server 2012 の列ストア インデックス機能をテストして楽しんでいました。このようなインデックスを使用してテーブルを更新/挿入することはできないため、いくつかのオプションを読みました: 別のテーブルを保持し、一括挿入ごとに新しいパーティションを使用するか、インデックスを無効にします。 、更新/挿入を実行してから、インデックスを再構築します。

私のテストでは、後者のオプションを選択し、次のストアド プロシージャで終了しました。

-- Disable the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] DISABLE

-- Insert data into tick table from staging table.
insert into Tick
select [Date],
       SymbolID,
       Price
from TickTemporary

-- Delete data from staging table.
delete from TickTemporary

-- Enable (rebuild) the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] REBUILD

これらの行を手動で実行すると、すべて正常に動作します。しかし、この手順を実行すると、列ストア インデックスを持つテーブルでは更新/挿入を実行できないというエラーが表示されます。

どうしてこれなの?

アップデート:

以前に受け入れた回答のアドバイスに従いましたが、それでも同じ結果が得られます。

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Disable the columnstore index.
EXEC DisableColumnStoreIndex

-- Insert data into tick table from staging table.
insert into Tick
select [Date],
       SymbolID,
       Price
from TickTemporary

-- Delete data from staging table.
delete from TickTemporary

-- Enable (rebuild) the columnstore index.
EXEC RebuildColumnStoreIndex

sproc呼び出しの周りに「begin tran」と「commit tran」を配置しようとしました。

次のような動的SQLを使用します。

declare @sql nvarchar(max)
set @sql =
    'insert into Tick
     select [Date],
            SymbolID,
            Price
     from TickTemporary'
exec(@sql)

動作しますが、実際には、動的SQLなしでやりたいと思っています。この場合はありえないのでしょうか?

4

2 に答える 2

4

チェックは実行時ではなく、コンパイル時に行われます。プロシージャーを独自のものに分離するか、動的 SQL を使用してください。

しかし、一般的なコメントとして、これは正しいアプローチではありません。同じ構造の別のテーブルに挿入し、この同じテーブルに列ストア インデックスを作成してから、パーティション スイッチを使用して古いテーブルを新しいテーブルに置き換える必要があります。古いテーブルを空のテーブルに切り替え、新しいテーブルに切り替えます。スイッチアウトされた古いデータをドロップします。How to Update a table with a Columnstore Index で説明されている手順と同様です。パーティション スイッチを使用すると、テーブルのユーザーが経験するダウンタイムが大幅に短縮されます。これは、古いテーブルがまだオンラインであり、挿入中および列ストアの構築段階で使用できるためです。

于 2012-10-29T07:55:32.957 に答える
1

このコンパイル時の実行の解決策は Option(recompile)です

create  PROCEDURE TEST
AS
BEGIN

ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] DISABLE

-- Insert data into tick table from staging table.

insert into Tick
select [Date],
       SymbolID,
       Price
from TickTemporary  **Option(recompile)**

-- Delete data from staging table.
delete from TickTemporary

-- Enable (rebuild) the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] REBUILD

End
于 2015-01-07T06:28:00.607 に答える