tsqlt-不使用非群集列存储索引

时间:2015-04-10 08:38:28

标签: sql-server tsql tsqlt

我正在尝试在触及非群集列存储表的过程上创建单元测试。

我创建了一个假表,然后在插入测试数据之前尝试删除和禁用CStore索引,但是当我尝试运行测试时,它总是出错,说“INSERT语句失败,因为数据无法在具有已更新的表中更新非聚簇列存储索引。考虑在发出INSERT语句之前禁用列存储索引,然后在INSERT完成后重建列存储索引“

这是tsqlt过程中的相关代码片段

EXEC [tSQLt].[FakeTable] @TableName = N'CommonDM.AccountBalances';

ALTER INDEX [IX_CS_FinanceDM_AccountBalances] ON [CommonDM].[AccountBalances] DISABLE

INSERT INTO commondm.AccountBalances
        ( MK_DatesID_TradeDate ,
          MK_CurrenciesID_CurrencyCode ,
          MK_UCRAccountsID_AccountID ,
          EndOfDayAccountBalanceEUR ,
          ClosingRateEURDKK ,
          ClosingRateEURAC ,
          DW_BatchID ,
          EndOfDayAccountBalanceAC ,
          RevaluationDKK ,
          RevaluationEUR ,
          MK_BusinessLinesID_BusinessLineID ,
          MK_UCRCounterpartsID_CounterpartID
        )
VALUES  ( 20150325 , -- MK_DatesID_TradeDate - int
          3 , -- MK_CurrenciesID_CurrencyCode - int
          25891201 , -- MK_UCRAccountsID_AccountID - int
          -3577.82776605942, -- EndOfDayAccountBalanceEUR - float
          7.46875 , -- ClosingRateEURDKK - float
          4.02910395425365 , -- ClosingRateEURAC - float
          3152289, -- DW_BatchID - int
          -14415.4399998685 , -- EndOfDayAccountBalanceAC - float
          88.6549559991928 , -- RevaluationDKK - float
          14.8043530611986 , -- RevaluationEUR - float
          2 , -- MK_BusinessLinesID_BusinessLineID - int
          31512216  -- MK_UCRCounterpartsID_CounterpartID - int
        )

ALTER INDEX [IX_CS_FinanceDM_AccountBalances] ON [CommonDM].[AccountBalances] REBUILD

1 个答案:

答案 0 :(得分:0)

很抱歉迟到你的问题答案。我现在才读到这个问题。答案可能与其他访客有关。

tSQLt中的伪表是普通表,为了测试目的而创建,没有所有外键的约束。因此Columnstore索引将执行正常。

但是,在SQL Server 2008/2012中,您无法修改具有columstore索引的表中的数据。

所以你要么必须实际DROP和RECREATE索引,要么你可能想为表创建一个分区方案。要插入数据,请在第二个(索引对齐的)表中加载数据,而不使用列存储索引(DROPped或DISABLEd)。然后添加列存储索引(CREATE或REBUILD),之后可以在目标表的空分区中切换新创建的分区。要修改数据,首先将相应的分区切换到第二个表,然后DROP或DISABLE索引。