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

person Saugat Mukherjee    schedule 10.04.2015    source источник
comment
Может быть, попробуйте это: установите GO после каждого оператора ALTER и INSERT. Хотя это просто дикая догадка с моей стороны.   -  person TT.    schedule 10.04.2015
comment
Добавление GO не сработает, потому что предоставленный сегмент кода будет из теста tSQLt, то есть хранимой процедуры. Могу я спросить, зачем вам нужен индекс columnstore для этого теста? Как вы ожидаете, какое влияние он окажет на результат теста? Если нет, то нужен ли он вообще на бутафорской таблице?   -  person datacentricity    schedule 10.04.2015
comment
Процедура, для которой я пишу модульный тест, запрашивает данные из CommonDM.AccountBalances, которая представляет собой некластеризованную таблицу columnstore. Таким образом, мне нужно подделать эту таблицу и сделать тестовые записи. И я не могу делать тестовые записи, пока не удалю/отключу индекс. Как еще я могу внести записи в эту поддельную таблицу (полученную из некластеризованной таблицы columnstore)? Если я не отключу, у меня не будет тестовых данных   -  person Saugat Mukherjee    schedule 10.04.2015
comment
Я признаю, что у меня еще не было необходимости использовать FakeTable в таблице с индексами columnstore, но если этот индекс не оказывает существенного влияния на поведение тестируемой процедуры, не могли бы вы просто подделать таблицу и вставить тестовые данные без добавления индекс columnstore для поддельной таблицы? Другая вещь, глядя на порядок, в котором вы запускаете свой код, после того, как вы подделали таблицу, у нее не будет никаких индексов. По умолчанию FakeTable временно создает копию таблицы без ограничений и где все столбцы допускают значение null, поэтому индекс CS даже не будет существовать в поддельной таблице.   -  person datacentricity    schedule 10.04.2015
comment
В первом случае я просто подделал эту таблицу и сделал вставку. Только когда я получил сообщение об ошибке при запуске теста, в котором говорилось, что данные не могут быть обновлены в таблице с некластеризованным индексом columnstore. Подумайте об отключении индекса columnstore перед выполнением инструкции INSERT, я поставил отключить и перестроить. Даже сейчас, когда я удаляю отключение и перестраиваю и просто подделываю таблицу и пытаюсь вставить, я продолжаю получать то же сообщение об ошибке . Заставляет меня задаться вопросом, могут ли поддельные таблицы вообще работать с некластеризованными индексированными таблицами CS.   -  person Saugat Mukherjee    schedule 10.04.2015
comment
На самом деле, у меня только что возникла мысль ... Интересно, похоже ли это на то, когда мы используем FakeTable для имитации представления, я обычно нахожу, что мне нужно написать вставку как динамический SQL, используя EXEC или sp_executesql, чтобы обойти собственный SQL Server Проверка. Сейчас нет времени проверить эту теорию, извините.   -  person datacentricity    schedule 11.04.2015
comment
@datacentricity: Ты красавица :). Это сработало! . Я только что создал строковую переменную, добавил туда оператор вставки и использовал exec (@sql). Вот и все. Без отключения и восстановления. Странно, что, несмотря на то, что поддельная таблица не наследует индекс columnstore, она дала мне, что вставка в таблицу columnstore невозможна ранее, если не использовался динамический sql. Но огромное спасибо!!!   -  person Saugat Mukherjee    schedule 13.04.2015


Ответы (1)


Извините, что опоздал с ответом на ваш вопрос. Только сейчас прочитал вопрос. Ответ может быть актуален для других посетителей.

Поддельные таблицы в tSQLt — это обычные таблицы, созданные для целей тестирования без ограничений всех внешних ключей. Таким образом, индексы Columnstore будут работать нормально.

Однако в SQL Server 2008/2012 нельзя изменять данные в таблице с индексом columstore.

Таким образом, вы либо должны фактически DROP и RECREATE индексы, либо вы можете создать схему секционирования для таблицы. Чтобы вставить данные, вы загружаете данные во вторую (выровненную по индексу) таблицу без индекса columnstore (DROPped или DISABLEd). Затем вы добавляете индекс columnstore (CREATE или REBUILD), после чего вы можете переключить вновь созданный раздел в пустой раздел целевой таблицы. Чтобы изменить данные, вы сначала переключаете соответствующий раздел на вторую таблицу и DROP или DISABLE индекс.

person Martijn van der Jagt    schedule 19.05.2016
comment
К сожалению, это не ответ на этот вопрос, который был специфичен для поддельной таблицы TSQLT. Если вы посмотрите на комментарии выше, решение, предложенное datacentricity, было ответом. Когда вы подделываете таблицу в tsqlt, индексов CS нет, поэтому удаление индексов также не работает. Для работы необходимо добавить динамический sql. - person Saugat Mukherjee; 17.10.2018