我正进入(状态

ORA-30926:无法在源表中获取稳定的行集

在以下查询中:

  MERGE INTO table_1 a
      USING 
      (SELECT a.ROWID row_id, 'Y'
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

我跑了 table_1 它有数据,而且我也运行了内部查询(src)其中也有数据。

为什么会出现这个错误以及如何解决?

有帮助吗?

解决方案

这通常是由在USING子句中指定的查询重复引起的。这可能意味着TABLE_A是一个父表和相同ROWID返回数次。

您可以迅速在查询中使用不同的(事实上,如果“Y”是一个恒定值,你甚至不需要把它放在查询)解决问题。

假设你的查询是正确的(不知道你的表),你可以做这样的事情:

  MERGE INTO table_1 a
      USING 
      (SELECT distinct ta.ROWID row_id
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

其他提示

您可能正在尝试更新目标表多次的同一行。我刚刚遇到了同样的问题,我公司开发的MERGE语句。确保您的更新不接触相同的记录超过一次在合并执行。

  

如何解决ORA-30926错误? (文件ID 471956.1)

1)确定发生故障的语句

  

ALTER会话组事件“30926迹名errorstack级别3”;

  

ALTER系统组事件“30926迹名errorstack断”;

当发生

和手表中UDUMP带.trc文件它。

2)在发现的SQL语句,如果检查是正确的(可能使用解释计划或TKPROF检查查询执行计划),并分析或如果最近没有做过相关的表计算统计。重建(或删除/重新创建)索引可以帮助太大。

3.1)是SQL语句中的合并吗? 评估由USING子句返回的数据,以确保没有重复值的加入。修改合并语句以包括确定性where子句

3.2),这是通过一个视图的UPDATE语句? 如果是的话,尽量填充视图结果表中并尝试直接更新表。

3.3)是否有在桌子上的触发器?尝试禁用它,看它是否仍然失败。

3.4)是否该语句包含在“IN-子查询”的非可合并视图?这会导致返回重复的行如果查询有一个“FOR UPDATE”的条款。看到错误2681037

3.5)是否有表未使用的列?删除这些可能会阻止错误。

4)如果修改SQL不固化该错误,则问题可能与该表中,尤其是如果有链接行。 4.1)上运行的SQL中使用的所有表“分析表VALIDATE STRUCTURE CASCADE”语句,看是否有在表或其索引任何损坏。 4.2)检查,并消除任何链状或放在桌子上移植行。有办法,以尽量减少此,如PCTFREE的正确设置。 使用时注意122020.1 - 行链接和移植 4.3)如果表是另外索引组织,请参阅: 注102932.1 - 上IOT中监控链接行

有错误今天上的12c和没有现有答案适合(无重复,没有非确定性表达式WHERE子句中)。 ,我的情况下被与错误相关的其他可能的原因,根据Oracle的消息文本(重点如下):

  

ORA-30926:无法获得行的一组稳定在源表,点击   原因:行的一组稳定无法得到的因为大DML活性或非确定性where子句

合并是一个更大批次的一部分,并与许多并发用户的实时数据库上被执行。有没有需要改变的声明。我在合并之前刚刚提交的事务,然后分别跑了合并,并再次提交。因此该解决方案是在该消息的建议行动找到:

  

措施:取下任何非确定性where子句和重新发出DML

{wargn}:请勿触摸SharePoint的数据库结构,它将使您的保修无效。

这是一个blob存储设计变量。随着存储需求的增加,您将看到它增加。

数据库只能持有这么多的数据,以便补偿它是分区的。此值表示使用中的分区。这进一步进入了切碎的存储,该存储现在代表单个文件,而是在凌晨的块中。

在SP2013中真正有效的存储如何?

所以如有一些人,我都在每个Mspress IT专业书籍上,它将在SharePoint 2013上发布。在其中一本书中,我谈论的是架构以及内容数据库的改变方式。其中一个更改是碎片的存储。是的,我在这里阅读了Bill Baer的帖子,他在这里有一个第二个,我同意他所说的一切(即使他在几个情况下没有真正使用内部架构的术语),除了我提出的一个点在最后。我还在这里阅读了丹霍姆的博客。他几乎得到了我所做的同样的结论。他甚至用最大64k卡盘尺寸为默认值(但文件在64K限制的情况下最大值,它们最终在它以下某处)。

所以,即使阅读所有此技术和SPC12 Mumbo Jumbo。我真的很想看到这款东西为自己工作,并在深深地挖掘,了解它是如何确实有效的所有博客都有不正确的。在那探索程序集,类,表格和存储过程中,我有几个啊HA矩。一些事实:

已切碎的存储是集中的文档,并且从存储角度出发,只有版本控制打开版本。它不是内容数据库或农场聚焦。这意味着什么?这意味着当文档是“切碎”(sphostblob)时,碎片特定于文档,并且没有对碎片完成的数据库宽哈希。这是什么意思?这意味着如果在两个不同的位置上传相同的文件,将创建相同的碎片,并且不会发生优化。

这意味着SharePoint在管理Blob时进行“更好”的努力。这不是我将称之为“伟大的”或“恒星”的东西,就像陡峭的解决方案一样。您仍需要一个RBS解决方案,将以欺骗方式汇总新的“小碎片斑点”。但是,如此小心,因为杰里米指出这里,RBS性能击中小碎片是不值得的!在这一点上,我会说使用切碎的存储是一个比价值命中的更重要,因为你现在有一个表格的表格,每个文件都有10-4500碎片。乘以那些你拥有的许多文件......这是一个表中的大量行。您还必须考虑到CPU周期,将碎片加上将碎片放在一起发送回客户端(这不是SQL Server上的Coilese)。一切都是为了通过边缘金额减少储存?

通过创建我正在调用“流映射”的内容来工作。此映射存储在“docstostreams”表中。您第一次上传文件,它被切割成较小的部分(除了有几个案例,它不会撕碎文档并刚刚放置单个斑点)。上传第二个更新的文件时,WFE将查询两个基于非文件的碎片(为每个文件添加大约10k或更多)。这些配置碎片具有剪切信息,即WFE将用于确定需要保存的碎片返回数据库。作为其中的一部分,建立了一种新的Stream Map,它使用了没有改变的任何旧碎片,以及新碎片。所有碎片都以特定的顺序称为BSN。从最低BSN到最高BSN的“流映射”开始。然后将这些碎片放回(减去配置碎片)以重新创建文件,然后传递回调用客户端 在对象模型中注释的一些重要课程:

spfilestreamManager - 负责计算流(ComputeStreamStowrite)

spfilestreamStore - 将sphostblobs保存回数据库(Putblobs),并从数据库中获取Blob(getBlobs *)

当使用完整的Office客户端时,完整文件将发送到SharePoint(仅当第一次调用Cellstorage.svc失败时...保留下面)。这是通过使HTTP放入文档的URL来完成的。 SharePoint通过其Cobalt类(CobaltStream来自Core Cobalt类)负责进行实际的粉碎和比较。我没有看到办公室客户(2010年或2013年),根据办公文件中的包零件做任何类型的文档(如果第一个呼叫成功,请再次工作)。 无论文件类型是什么,我确实证实了碎片。这让我觉得碎片有点随意(由撕裂的默认64k限制),不会完美地抓住一切(我

e一个碎片的一半变化,另一个碎片而不是一个切碎的组件的变化的一半。我试图看看我是否可以弄清楚碎片是如何工作的,但是当你进入钴阶层时,事情会变得非常疯狂,因为他们是太多抽象的课程。

更新:请参阅此博客文章,了解我的更新经验,并使用办公客户端编辑和智能更新(它确实工作)...

回到上面的一个点之一。我无法获取办公室客户(2010年或2013),以便在比尔帖子中提到的任何类型的智能更新(使用单词和PowerPoint使用特定的客户端构建)。在其他病区里,我只想发送我对SharePoint的更改。我以前从未真正测试过这个,并期待在行动中看到它,但唉,它似乎并没有做到这一点。我只是在多用户编辑模式(OWA?)中猜测,您是否会看到这种类型正在使用(更新:并且此猜测是正确的!见下文!)。就像一个fyi一样,这就是我在办公室和SharePoint om所做的呼叫:

使用我们令人敬畏的朋友提示程序监控流量 将PowerPoint文件上传到SharePoint 在PowerPoint客户端中打开PowerPoint 从PowerPoint中删除了幻灯片,保存了它 Office将整个文件发送到SharePoint(它在Put请求的Content-Size标题中可见,这是此种情况) SharePoint会破碎并创建任何新碎片 将幻灯片放回(ctrl-z)中,保存文件,再次发送整个文件 创建了一个新版本和类似的碎片,但有些版本从第一个上传\第二次更新

如果有人知道如何使用办公室客户和SharePoint OM可靠地获得此工作,请告诉我。否则,我将不得不说我们在这个整个“delta”的变化上从Office Client无意义的变化,办公室客户端和WFE之间没有网络优化。在这种情况下,切碎的存储真正只是在这里为我们提供几个字节,并在那里P>

更新:Office Web Apps和Shredded Storage - 这是您在客户端(OWA)和WFE之间的线路优化。它的工作原理。当对文件的请求由SharePoint进行时,OWA将要求WFE给出该文件。该文件将由WFE从碎片构建。当两个用户打开文件进行编辑时,创建了一种新类型的碎片容器,称为“分区”。此分区包含每个用户正在处理的碎片。这就是碎片被分解为较小的XML碎片的地方。由于文档的每个部分更改,创建了新分区。当有人想看看另一个人已经完成了什么时,他们会要求这个新分区,它(并且只有它)将被发送给客户端。所做的任何更改也是单独发送,整个文件不是。

所以这把我们放在哪里?以下是关于碎成存储的现实和更正的详细信息(因为互联网上的碎片上的每个博客都有错误)。你必须用3件事测试细碎的存储,看看你是否真的得到了任何好处(无论是存储还是基于网络)。

使用版本控制打开(您获得的存储福利,没有它,您不会获得任何存储效益) 使用Office Web Apps(您将客户端提供给WFE网络优化以及丁用户编辑中的“分区”效果) 当使用Office或SharePoint客户端时,无论如何,只有在编写文档时才获得WFE到SQL Server网络优化(但是,Office和SharePoint客户端之间没有电线效益,并且当第一个呼叫无法进行CellStorage时,WFE在WFE之间。 SVC)

http://blogs.archetioningconnectedsystems.com/blogs/cjg/archive/2012/12/21/2012/12/21/how-shredded-storage-really-works-in-sp2013.aspx

碎片。

对一般情况下使用 DISTINCT 解决错误 ORA-30926 的进一步说明:

您需要确保 USING() 子句指定的数据集没有重复的值 连接列, , IE。这 ON() 子句中的列.

在 OP 的示例中,USING 子句仅选择一个键,将 DISTINCT 添加到 USING 子句就足够了。但是,在一般情况下,USING 子句可能会选择要匹配的键列和要在 UPDATE ... 中使用的属性列的组合。SET 子句。因此,在一般情况下,将 DISTINCT 添加到 USING 子句仍将允许相同键的不同更新行,在这种情况下,您仍然会收到 ORA-30926 错误。

这是对 DCookie 的答案和 Tagar 的答案中第 3.1 点的阐述,根据我的经验,这可能不会立即显而易见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top