当我运行下面的伪代码:ALTER INDEX语句被忽略?
BEGIN TRANSACTION @TName
BEGIN TRY
-- Disable columnstore index
ALTER INDEX CSIX_MyTable ON dbo.MyTable DISABLE;
MERGE INTO dbo.MyTable
...
我得到这个错误:
MERGE statement failed because data cannot be updated in a table with a columnstore index. Consider disabling the columnstore index before issuing the MERGE statement, then rebuilding the columnstore index after MERGE is complete.
我不明白的是,我清楚地禁用索引我执行MERGE
之前。我有双重,三重和四重检查,我禁用了正确的索引。事实上,如果我自己执行ALTER INDEX
语句,然后再次运行上述块,那么MERGE
就完成了。任何想法,为什么会发生这种情况或我可以如何解决它?
编辑:
我也有下面的伪代码,如果没有问题,执行:
BEGIN TRANSACTION @TName
BEGIN TRY
-- Disable columnstore index
ALTER INDEX CSIX_MyTable2 ON dbo.MyTable2 DISABLE;
INSERT INTO #MyTempTable(Columns...)
SELECT Columns...
FROM (
MERGE INTO dbo.MyTable
...
OUTPUT ...
) A
...
该指数被禁用,而在MERGE
过程顺利。看来出于某种原因,包装INSERT
声明似乎“欺骗”编译器执行代码。
我确信将ALTER INDEX
语句转移到另一个任务将解决问题,但我希望这个问题是试图发现代码不运行的原因。
您确定这是columnstore索引吗? – Paparazzi
@Blam绝对确定。 – Kittoes0124
对不起,不知道你的问题的直接答案,但我建议你考虑使用this article中描述的“表格分区”方法。如果这对你有效,问题就不存在了。 –