【问题标题】:tsqlt- Not working with Non Clustered Columnstore Indextsqlt - 不使用非聚集列存储索引
【发布时间】:2015-04-10 08:38:28
【问题描述】:

我正在尝试对涉及非聚集列存储表的过程创建单元测试。

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

这是 tsqlt 过程中的相关代码 sn-p

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

【问题讨论】:

  • 也许可以试试这个:在每个ALTERINSERT 语句之后设置一个GO。不过,这只是我的一个疯狂猜测。
  • 添加“GO”将不起作用,因为提供的代码段将来自 tSQLt 测试,即存储过程。我能问一下为什么您需要存在此测试的列存储索引 - 您希望它对测试结果产生什么影响?如果没有,那么你在伪造的桌子上是否需要它?
  • 我正在为其编写单元测试的过程从非聚集列存储表 CommonDM.AccountBalances 查询数据。因此,我需要伪造该表并制作测试条目。除非我删除/禁用索引,否则我无法进行测试条目。我还能如何输入这个假表(从非聚集列存储表派生)?如果我不禁用,我将无法获得测试数据
  • 我承认我还没有需要在具有列存储索引的表上使用 FakeTable,但除非该索引对被测过程的行为有重大影响,否则你不能只是伪造表并插入测试数据而不将列存储索引添加到伪造的表中?另一件事是查看您运行代码的顺序,一旦您伪造了表,它将没有任何索引。默认情况下,FakeTable 会临时创建一个没有约束的表副本,并且所有列都允许为 null,因此 CS 索引甚至不会存在于伪造的表上
  • 其实我刚刚有一个想法...不知道这是否类似于我们使用FakeTable模拟视图时,我通常发现我需要使用EXEC将插入编写为动态SQL或 sp_executesql 以通过 SQL Server 自己的验证。抱歉,现在没有时间测试这个理论。

标签: sql-server tsql tsqlt


【解决方案1】:

很抱歉回答您的问题迟到了。我现在才读到这个问题。答案可能与其他访问者相关。

tSQLt 中的假表是普通表,是为测试目的而创建的,没有所有外键的约束。所以列存储索引会正常执行。

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

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

【讨论】:

  • 不幸的是,这不是这个问题的答案,它是特定于 TSQLT 假表的。如果您查看上面的 cmets,“数据中心性”提出的解决方案就是答案。当你在 tsqlt 中伪造一个表时,没有 CS 索引,因此删除索引也不起作用它必须添加为动态 sql 才能工作。
猜你喜欢
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 2023-03-10
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多