修复: 部分会导致在 SQL Server 2014年聚集的 columnstore 索引的查询

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3067257
本文讨论了在 Microsoft SQL Server 2014年聚集的 columnstore 索引的查询过程中出现的问题。这篇文章了 一种解决方案 这一问题。
概要
使用扫描在 Microsoft SQL Server 2014年聚集的 columnstore 索引的查询时,您可能会在极少数的情况下收到部分查询结果。

运行以下操作时,将发生此问题。
第 1 步
[插入或大容量插入] 的事务处理 SQL 语句具有聚集 columnstore 索引的表中插入数据。在此操作时,适用以下条件:
  • 当事务处理 SQL 语句达到行的阈值时,则关闭行有段 S1 的 R1。
  • 段 S1 指向本地字典 D1。
  • 该语句继续插入行到新行 R2。
  • 当关闭时行 R1 时,本地字典 D1 还没有关闭。如果字典 D1 仍有可用空间,可以使其保持打开状态,新行 R2 再使用它。
第 2 步
如果事务处理 SQL 语句被终止或取消之前关闭新行 R2,,适用以下条件:
  • Columnstore 元数据更改发生在独立于外部事务提交的子事务处理。
  • 此时,R1 仍然存在"正在建设中"不可见状态和中段 S1 系统表中的行引用字典 D1。
  • 没有字典 D1 的系统表中创建行。这是因为事务处理 SQL 语句永远不会有机会关闭现有的行。因此,现有的行仍然存在。
第 3 步
一般情况下,如果元组移动器后台任务启动事务处理 SQL 语句结束后,后台任务删除不可见行 R1 和 S1 段。如果一个新的事务处理 SQL 语句立即开始,并创建行都有一个新段要求的新的本地字典的 S3 的 R3,不能重用字典 D1 的内部 ID。这是因为 columnstore 的内存中状态跟踪的词典使用的 Id。因此,S3 段将引用新的词典 D2。

注意:在此步骤中的条件是常见的情况。因此,不发生任何损坏。
第 4 步
如果 SQL Server 失去字典 D1 的内存中状态之前的元组移动任务生效 (和执行第 3 步中所述),会发生本文中描述的问题。

备注:
  • 此事件发生以下情况之一:
    • SQL Server 会遇到内存负载和内存中字典 D1 驱出内存的内容。
    • 重新启动 SQL Server 的实例。
    • 包含 columnstore 聚簇的索引的数据库离线,然后重新联机。
  • 之后任何这些事件的发生和 SQL Server 重新加载内存中的结构,没有任何记录,词典 D1 和其内部 ID 已存在。这是因为字典 D1 中 conceled 的系统表的事务处理 SQL 语句结束时不保留。
  • 元组移动器后台任务从此时开始,如果没有错误发生因为步骤 3 所述的条件适用。
  • 如果元组移动器后台任务 (每上一个项目符号项中) 开始之前创建新行 R3,则 SQL Server 将相同的内部 ID 分配给新的词典 D1、 并引用字典 D1 行 R3 中段 S3。
  • 元组移动器后台任务启动后在上一步操作后,它将丢弃不可见行 R1 和新词典 D1 以及其段 S1。这是因为元组移动器认为该新词典 D1 和 D1 的 S1 的引用都是相同的原始词典。

    注意:当发生这种情况时,不能查询行 R3 中的内容。
解决方案
对于 SQL Server 问题首先修复了下面的累积更新:


此问题的修补程序还包括在下列常规分发版本 (GDR) 更新:

SQL Server 2014 QFE 的安全更新
此更新包括累积更新 8、 此重要的修复程序,以及所需的 MS15-058 安全更新。

SQL Server 2014 GDR 的安全更新
此更新包含此重要修复和累计安全修补程序 MS15-058 通过。

SQL Server 2014 Service Pack 1 GDR 更新与安全无关
此更新包括仅此重要的修复程序。

有关累积更新 SQL Server

SQL Server 的每个新累积更新包含所有修补程序和所有安全修复程序是附带在以前的累积更新。SQL Server,请参阅最新的累积更新:
更多信息

错误消息

在当前受影响的数据库中,如果您运行 DBCC CHECKDB 在应用此修复程序后,您收到以下错误消息:
5289 消息,级别 16,状态 1,第 1 行
Columnstore 聚集索引表上的 cci 't' 都有一个或多个数据字典中的值不匹配的数据值。从备份中还原数据。

在当前受影响的数据库中,应用此修复程序后扫描受影响的表的查询运行时您将收到以下错误消息:
5288 消息,级别 16,状态 1,第 1 行
Columnstore 索引有一个或多个数据字典中的值不匹配的数据值。请有关详细信息,运行 DBCC CHECKDB。

如果您收到这些错误,您可以通过批量导出的数据不受影响的列 rowgroups 和放置或创建聚簇的 columnstore 索引后再重新加载数据保存未损坏的数据。您应该启用跟踪标志 10207 取消 5288 错误并恢复到跳过已损坏的 rowgroups 的旧行为。

注意:对于这行有段 S3 的 R3 生成 5288 和 5289 错误消息。跟踪标志 10207 用于提取不受缺少字典 D1 行 R3 的各段。

受影响的数据库的查询

若要确定是否包含 columnstore 索引的数据库已受此问题,请运行下面的查询:
select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

备注:
  • 您必须对包含正在运行 SQL Server 的服务器上的 columnstore 索引的每个数据库运行此查询。空结果集指示数据库不会受到影响。
  • 在一段期间执行此查询时,将创建新的 rowgroups 或更改现有 rowgroups 的状态没有活动。例如,以下活动可以修改状态的 rowgroups: 建立索引,索引重组,进行大容量插入,压缩增量存储的元组移动。

    执行查询之前您可以通过使用跟踪标志 634 禁用后台元组移动任务。使用此命令可以禁用后台任务: DBCC TRACEON (634、-1)。执行完查询后,请记住使用命令重新启用后台任务: DBCC TRACEOFF (634、-1)

    此外请确保没有运行此查询时,使用 columnstore 索引的表中插入数据批量插入/BCP/选择-插入命令。

    建议使用以下步骤来防止查询返回的误判。
状态
Microsoft 已经确认这是"适用于"一节中列出的 Microsoft 产品中的问题。

属性

文章 ID:3067257 - 上次审阅时间:07/26/2015 08:10:00 - 修订版本: 4.0

Microsoft SQL Server 2014 Service Pack 1, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard

  • kbqfe kbsurveynew kbexpertiseadvanced kbfix kbmt KB3067257 KbMtzh
反馈