tsqlt- не работает с некластеризованным индексом Columnstore.
Я пытаюсь создать модульный тест для процедуры, которая касается некластеризованной таблицы columnstore.
Я создаю фальшивую таблицу и затем пытаюсь сбросить и отключить индекс CStore перед вставкой тестовых данных, но когда я пытаюсь запустить тест, он всегда выдает ошибку: "Не удалось выполнить оператор INSERT, поскольку данные не могут быть обновлены в таблице, в которой есть некластеризованное хранилище столбцов. index. Рассмотрите возможность отключения индекса columnstore перед выполнением инструкции INSERT, а затем перестройку индекса columnstore после завершения 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 ответ
Извините за опоздание с ответом на ваш вопрос. Я только сейчас читаю вопрос. Ответ может быть актуален для других посетителей.
Поддельные таблицы в tSQLt - это обычные таблицы, созданные для целей тестирования без ограничений всех внешних ключей. Так что индексы Columnstore будут работать нормально.
Однако в SQL Server 2008/2012 нельзя изменять данные в таблице с индексом columstore.
Таким образом, вам либо нужно на самом деле DROP и RECREATE индексы, либо вы можете создать схему секционирования для таблицы. Для вставки данных вы загружаете данные во вторую (выровненную по индексу) таблицу без индекса columnstore (DROPped или DISABLEd). Затем вы добавляете индекс columnstore (CREATE или REBUILD), после чего вы можете переключить вновь созданный раздел в пустой раздел целевой таблицы. Чтобы изменить данные, вы сначала переключаете соответствующий раздел на вторую таблицу и удаляете или отключаете индекс.