以下是一些可以尝试的步骤: 1.两次和三次检查分区和子分区的定义和边界。它们很容易搞砸,尤其是子分区。你必须实际检查所有分区的子分区布局。仅仅因为一个子分区存在于一个分区中并不意味着它必须存在于另一个分区中。分区名称是无关的..重要的是边界(DBA_TAB_PARTITIONS/SUBPARTITIONS中的HIGH_VALUE,不幸的是,它是一个LONG,因此需要PL/SQL解决方案来以编程方式进行查询)。 1.检查insert语句,并验证您是否将正确的源列放入正确的目标列中。使用显式列列表INSERT和SELECT子句,不要依赖默认的列顺序。它可能会将错误的列粘在分区键中。 1.如果以上所有检查都正确,请检查源表是否发生过分区交换。源表所有者可能使用“WITHOUT VALIDATION”子句进行了分区交换,以加快速度。这可能导致错误的数据位于错误的分区中,这不会抛出错误,直到您尝试选择此数据并将其插入到另一个类似的分区表中。在这一点上,它正在进行验证,如果它没有Map到其他分区,就会抛出错误。 1.请记住,子分区可能因分区而异。您可能已经从最新的,或第一个,或子分区模板中获取了定义,但这些都不能保证这就是您需要的所有分区。如果这是问题所在,一个简单的测试方法是确保定义了(DEFAULT)子分区(假设它是LIST)以捕获任何离群值。 1.如果它是一个RANGE分区(例如某个日期列),您可以创建一个遥远的未来日期分区(例如VALUES LESS THAN (TO_DATE('12/31/9999','MM/DD/YYYY'))),然后尝试插入。如果有流氓未来日期,它将进入该未来分区,然后您可以查询它以找出它是什么日期。 1.最后,请考虑根本不定义分区,但使用INTERVAL(如果RANGE)或自动列表(如果为LIST),以便Oracle在您插入数据时自动创建分区(例如PARTITION BY RANGE(datecol) INTERVAL NUMTOYMINTERVAL(1,'MONTH')。你仍然需要定义一个子分区模板,这样你的子分区就可以用每个子分区创建了。我发现间隔分区在任何时候都是可取的。这是可能的(除了一些外围的例外),它是你的好朋友,节省了大量的输入和容易出错的分区定义。
2条答案
按热度按时间8gsdolmq1#
以下是一些可以尝试的步骤:
1.两次和三次检查分区和子分区的定义和边界。它们很容易搞砸,尤其是子分区。你必须实际检查所有分区的子分区布局。仅仅因为一个子分区存在于一个分区中并不意味着它必须存在于另一个分区中。分区名称是无关的..重要的是边界(
DBA_TAB_PARTITIONS/SUBPARTITIONS
中的HIGH_VALUE
,不幸的是,它是一个LONG
,因此需要PL/SQL解决方案来以编程方式进行查询)。1.检查insert语句,并验证您是否将正确的源列放入正确的目标列中。使用显式列列表
INSERT
和SELECT
子句,不要依赖默认的列顺序。它可能会将错误的列粘在分区键中。1.如果以上所有检查都正确,请检查源表是否发生过分区交换。源表所有者可能使用“
WITHOUT VALIDATION
”子句进行了分区交换,以加快速度。这可能导致错误的数据位于错误的分区中,这不会抛出错误,直到您尝试选择此数据并将其插入到另一个类似的分区表中。在这一点上,它正在进行验证,如果它没有Map到其他分区,就会抛出错误。1.请记住,子分区可能因分区而异。您可能已经从最新的,或第一个,或子分区模板中获取了定义,但这些都不能保证这就是您需要的所有分区。如果这是问题所在,一个简单的测试方法是确保定义了
(DEFAULT)
子分区(假设它是LIST
)以捕获任何离群值。1.如果它是一个
RANGE
分区(例如某个日期列),您可以创建一个遥远的未来日期分区(例如VALUES LESS THAN (TO_DATE('12/31/9999','MM/DD/YYYY'))
),然后尝试插入。如果有流氓未来日期,它将进入该未来分区,然后您可以查询它以找出它是什么日期。1.最后,请考虑根本不定义分区,但使用
INTERVAL
(如果RANGE
)或自动列表(如果为LIST
),以便Oracle在您插入数据时自动创建分区(例如PARTITION BY RANGE(datecol) INTERVAL NUMTOYMINTERVAL(1,'MONTH')
。你仍然需要定义一个子分区模板,这样你的子分区就可以用每个子分区创建了。我发现间隔分区在任何时候都是可取的。这是可能的(除了一些外围的例外),它是你的好朋友,节省了大量的输入和容易出错的分区定义。uqzxnwby2#
看起来像你试图插入数据的分区不存在,你有2个选项。
1.从源表获取DDL并在目标表上创建这些分区。
1.运行此查询,从ALL_TAB_PARTITIONS a、ALL_PART_KEY_COLUMNS b中选择partition_name、column_name、high_value、partition_position,其中table_name ='YOUR_TABLE'和a.table_name =b.name;
这个查询列出了用作键的列名和允许的值。请确保插入允许的值(high_value)。否则,如果定义了默认分区,它将转到那里。
谢谢