【问题标题】:Azure Sql Server V12 Bulk load error on merge statement合并语句上的 Azure Sql Server V12 批量加载错误
【发布时间】:2016-09-19 21:21:11
【问题描述】:

我有一个带有简单合并语句的查询来更新或插入表中的数据:

MERGE INTO table_name AS TARGET
USING (
    VALUES (
        :a0
        ,:b0
        ,:c0
        )...
    ) AS SOURCE(A, B, C)
    ON SOURCE.B = TARGET.B
        AND SOURCE.C = TARGET.C
WHEN NOT MATCHED
    THEN
        INSERT (
            A
            ,B
            ,C
            )
        VALUES (
            SOURCE.A
            ,SOURCE.B
            ,SOURCE.C
            );

此表在两列上有一个非聚集索引,用于唯一性约束。 此查询在 Azure 中的“业务”数据库上运行良好。在“S2”数据库上迁移到 SQL V12 后,当我尝试合并大量条目时会发生此错误:

带有消息“SQLSTATE[42000]”的未捕获异常“PDOException”:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]无法批量加载。批量数据流被错误地指定为已排序或数据违反了目标表施加的唯一性约束。以下两行排序顺序不正确:第一行主键:(A,B,C),第二行主键:(A,D,E)。

微软似乎知道这个问题:https://support.microsoft.com/en-us/kb/3055799

但在 Azure 中,我无法更新 SQL Server。我怎样才能让它工作?

【问题讨论】:

  • “SQL Server V12”是什么意思? SQL Server 2012(内部版本号为 11.0)?还是您的意思是 SQL Server 2014(内部版本号为 12.0)??
  • 在 Azure 门户中,我只能看到“V12”。 “商业”和“网络”服务计划是“V2”版本。如果我执行“SELECT @@VERSION AS 'SQL Server Version';”在数据库上,我得到这个“Microsoft SQL Azure (RTM) - 12.0.2000.8”。所以,它是一个 SQL Server 2014。

标签: sql-server azure azure-sql-database


【解决方案1】:

经过一些研究和测试,我找到了一种解决方法,方法是在查询末尾添加“OPTION (LOOP JOIN, FORCE ORDER);”通过修改默认执行计划来绕过排序错误。

它也适用于“OPTION (MERGE JOIN, FORCE ORDER);”取决于源表和目标表的行数。

有关选项的更多信息:https://technet.microsoft.com/en-us/library/ms181714.aspx

【讨论】:

  • 为了改进我的解决方法,它只适用于“OPTION (MERGE JOIN, FORCE ORDER);”。 LOOP JOIN 在 Azure(不是 VM)上使用最新的 SQL Server V12 时也会产生错误。
【解决方案2】:

我们发现查询优化器生成的执行计划存在问题。 这将很快得到修复。

同时解决此问题的另一个选项是禁用索引上的 page_lock。

ALTER INDEX [<index name>] ON [<schema>].[<table name>] 
REBUILD WITH (ALLOW_PAGE_LOCKS = OFF) 

使用此解决方法,您无需修改​​查询。

【讨论】:

    【解决方案3】:

    你好@Yochanan Rachamim,

    感谢您的回答。

    我尝试应用您的修复,但没有效果。 经过更多研究,我发现了一个已知的并发错误:https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

    我终于通过在 MERGE 语句中添加“WITH (HOLDLOCK)”解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2017-05-18
      • 2012-10-26
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      相关资源
      最近更新 更多