【问题标题】:Switch Partitioning failing due to mismatch in file groups of source and destination tables由于源表和目标表的文件组不匹配,切换分区失败
【发布时间】:2017-07-14 19:37:44
【问题描述】:

我正在尝试在其中一张表上实现切换分区,并确保分区功能、方案、文件组工作正常。但是当我运行以下命令时出现文件组错误。有人可以分享您对此的看法吗?

命令:-

ALTER TABLE XYZ SWITCH PARTITION  5 TO ABC PARTITION  5;

错误:-

ALTER TABLE SWITCH 语句失败。表 'XYZ' 位于文件组 'PRIMARY' 中,表 'ABC' 的分区 5 位于文件组 'FG_5' 中。

【问题讨论】:

  • 当我将表分布在多个文件组中时,如何避免此错误。
  • 这两个表是否在同一个数据库中?
  • 是的,两者都在同一个数据库中
  • ABC是新的空表吗?
  • ABc 是一个分区表。XYZ 和 ABC 具有相同的表结构。

标签: sql sql-server sql-server-2014 partitioning sql-server-2016


【解决方案1】:

可能会在现有表上创建一些聚簇索引。因此,在可能不同的表上创建集群索引时会提到文件组。或者如果您可以删除 ABC 表并再次创建并尝试查询。

查询表和索引名称的文件组。

select f.name,o.name,i.name from sys.indexes i inner join  sys.filegroups f on i.data_space_id=f.data_space_id
 inner join sys.all_objects o on o.object_id= i.object_id 
 where o.name in ('ABC','XYZ')

我不会说这是解决方案,但这应该有助于解决问题。

【讨论】:

  • 我正在做的一件事是在执行 ALTER SWITCH PARTITION 之前,我正在删除源表上的聚集列存储索引。
  • 您可以运行我提到的查询来查看与您的表关联的文件组吗?您是否尝试删除目标表并创建一个新表并尝试查询?
【解决方案2】:

该错误表明源表和目标表未对齐存储。运行以下查询以确保源文件组和目标文件组在表和索引中都相同:

SELECT
    OBJECT_NAME(p.object_id) AS ObjectName, 
    i.name AS IndexName, 
    p.index_id AS IndexID, 
    ds.name AS PartitionScheme, 
    p.partition_number AS PartitionNumber, 
    fg.name AS FileGroupName, 
    prv_left.value AS LowerBoundaryValue, 
    prv_right.value AS UpperBoundaryValue, 
    CASE pf.boundary_value_on_right WHEN 1 THEN 'RIGHT' ELSE 'LEFT' END AS PartitionFunctionRange, 
    p.rows AS Rows
FROM
    sys.partitions AS p INNER JOIN
    sys.indexes AS i ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN
    sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id INNER JOIN
    sys.partition_schemes AS ps ON ps.data_space_id = ds.data_space_id INNER JOIN
    sys.partition_functions AS pf ON pf.function_id = ps.function_id INNER JOIN
    sys.destination_data_spaces AS dds2 ON dds2.partition_scheme_id = ps.data_space_id AND dds2.destination_id = p.partition_number INNER JOIN
    sys.filegroups AS fg ON fg.data_space_id = dds2.data_space_id LEFT OUTER JOIN
    sys.partition_range_values AS prv_left ON ps.function_id = prv_left.function_id AND prv_left.boundary_id = p.partition_number - 1 LEFT OUTER JOIN
    sys.partition_range_values AS prv_right ON ps.function_id = prv_right.function_id AND prv_right.boundary_id = p.partition_number
WHERE
    p.object_id IN (
        OBJECT_ID(N'dbo.ABC') 
        , OBJECT_ID(N'dbo.XYZ')
    )
    AND p.partition_number = 5
ORDER BY
     ObjectName
    ,IndexName
    ,PartitionNumber;

【讨论】:

  • 运行此查询时未返回任何行...事实上我删除了 p.object_id 部分但仍然没有返回任何行...
  • 我实际上是在源表上创建聚集列存储索引,然后在进行切换分区之前将其删除...
  • @Teja,聚集列存储索引是否已分区?我更新查询以返回分区和非分区表/索引。
  • 嗨,Dan - 源表未分区,但我正在创建一个聚集列存储索引并在此之后删除它。一旦删除索引,我正在执行 alter table switch partition。
  • 如果表没有分区,为什么要指定分区 5 作为源?如果源是非分区堆而目标是分区堆,则需要确保源表位于文件组 FG_5 上并且具有与目标分区边界匹配的检查约束。
【解决方案3】:

检查您的分区方案。两个表应该在同一个文件组中。您应该在分区方案中涉及 PRIMARY 或将 SOURCE 表移动到目标表将使用的目标 FILEGROUPS。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多