ORA-30926: Incapaz de obter um conjunto estável de linhas nas tabelas de origem

StackOverflow https://stackoverflow.com/questions/2337271

  •  22-09-2019
  •  | 
  •  

Pergunta

estou obtendo

ORA-30926: Incapaz de obter um conjunto estável de linhas nas tabelas de origem

Na consulta a seguir:

  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';

Eu corri table_1 tem dados e também executei a consulta interna (src) que também possui dados.

Por que esse erro viria e como ele pode ser resolvido?

Foi útil?

Solução

Isso geralmente é causado por duplicatas na consulta especificada no uso da cláusula. Isso provavelmente significa que a tabela_a é uma tabela pai e o mesmo rowid é retornado várias vezes.

Você pode resolver rapidamente o problema usando um distinto em sua consulta (na verdade, se 'y' for um valor constante, você nem precisará colocá -lo na consulta).

Supondo que sua consulta esteja correta (não conheça suas mesas), você pode fazer algo assim:

  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';

Outras dicas

Você provavelmente está tentando atualizar a mesma linha da tabela de destino várias vezes. Acabei de encontrar o mesmo problema em uma declaração de mesclagem que desenvolvi. Certifique -se de que sua atualização não toque no mesmo registro mais de uma vez na execução da mesclagem.

Se você criar um fluxo de trabalho do site, isso pode ser agendado para executar em um determinado momento e pode excluir os itens da sua lista.

Um fluxo de trabalho baseado em lista provavelmente teria que pausar até um determinado momento e excluir os itens quando acordar.

Alternativamente, você poderia definir uma política na lista para excluir itens com mais de uma certa idade?

Tive o erro hoje em um 12C e nenhuma das respostas existentes se encaixava (sem duplicatas, sem expressões não determinísticas na cláusula WHERE). Meu caso estava relacionado a essa outra causa possível do erro, de acordo com o texto da mensagem da Oracle (ênfase abaixo):

ORA-30926: Incapaz de obter um conjunto estável de linhas nas tabelas de origem
Causa: Um conjunto estável de linhas não poderia ser obtido por causa da grande atividade DML ou uma cláusula não determinística onde.

A fusão fazia parte de um lote maior e foi executada em um banco de dados ao vivo com muitos usuários simultâneos. Não havia necessidade de mudar a declaração. Acabei de comprometer a transação antes da fusão, depois corri a mesclagem separadamente e cometi novamente. Portanto, a solução foi encontrada na ação sugerida da mensagem:

Ação: Remova qualquer não determinístico onde cláusulas e Reemuja o DML.

{AVISO}: Não toque na estrutura do banco de dados do SharePoint, ele invalidará sua garantia.

Esta é uma variável de design de armazenamento BLOB. Você vai ver isso aumentar como os requisitos de armazenamento aumentarem.

Um banco de dados só pode manter muitos dados para compensá-lo é particionado. Este valor representa a partição em uso. Isso foi mais longe em armazenamento desfiado que agora representa um único arquivo, mas em pedaços de deltas.

Como o armazenamento triturado realmente funciona em SP2013

Então, como alguns de vocês saberem, estou em cada um dos livros do MSPRESS que será lançado no SharePoint 2013. Em um dos livros, estou falando sobre a arquitetura e como os bancos de dados de conteúdo foram alterados. Uma dessas mudanças é armazenamento desfiado. Sim, eu li o poste de Bill Baer aqui e ele tem um segundo aqui, e eu concordo com tudo o que ele diz (mesmo que ele realmente não use a terminologia da arquitetura interna em vários casos), exceto por um ponto que eu trago no fim. Eu também li o blog de Dan Holme aqui. Ele praticamente chega às mesmas conclusões que eu faço. Ele até pregou com o tamanho máximo de Chuck do Max 64k como o padrão (mas os arquivos não max no limite de 64K, eles acabam em algum lugar abaixo dele).

Então, mesmo depois de ler todo este Thechet e SPC12 Mumbo Jumbo. Eu realmente queria ver essas coisas trabalhando para mim e que exigia cavar profundamente para aprender como isso realmente funciona de todos os blogs incorretos. Nessa exploração das assembléias, classes, tabelas e procedimentos armazenados, tive alguns momentos ah ha. Alguns fatos:

Storage Shredded é o documento focado e, a partir de um ponto de vista de armazenamento, somente valioso com o controle de versão ligado. Não é baseado em conteúdo ou fazenda focada. O que isso significa? Significa que, quando um documento é "triturado" (SphostBlob), os fragmentos são específicos do documento e não há hashes largos de banco de dados que é feito do Shred. O que isto significa? Significa que, se você fizer o upload do mesmo arquivo em dois lugares diferentes, os mesmos fragmentos serão criados e nenhuma otimização ocorrerá.

Isso significa que o SharePoint faz um esforço "melhor" no gerenciamento de blobs. Não é o que eu chamaria de "Great" ou "Stellar" como a solução que o storsimple construiu. Você ainda precisará de uma solução RBS que agregará os novos "pequenos blobs tritados" em uma moda desacotando. Mas tenha muito cuidado com isso, como Jeremy aponta aqui, o desempenho do RBS atingido por pequenos pedaços não vale a pena! Neste ponto, eu diria que usar armazenamento desfiado é mais um sucesso do que vale porque agora você tem uma tabela que terá de 10 a 4500 fragmentos para cada arquivo. Multiplique as vezes, no entanto, muitos arquivos que você tem ... e esse é um número muito grande de linhas em uma única tabela. Você também deve levar em conta o ciclo da CPU que é anexando os fragmentos juntos para serem enviados de volta para o cliente (isso não é feito pela Coalese no SQL Server). Tudo por uma questão de reduzir seu armazenamento por um valor marginal?

Armazenamento Shredded funciona criando o que estou chamando um "mapa de fluxo". Este mapa é armazenado na tabela "docstostreams". A primeira vez que você carregar um arquivo, ele é desfiado nas partes menores (exceto que havia alguns casos em que não desfenda o documento e apenas colocar um único blob). Quando você carregar um segundo arquivo atualizado, o WFE consultará dois fragmentos com base em arquivo (que adicionam cerca de 10k ou mais a cada arquivo). Esses fragmentos de configuração têm informações de partida que o WFE usará para determinar quais pedaços precisam ser salvos de volta ao banco de dados. Como parte disso, um novo mapa de fluxo é construído que usou quaisquer fragmentos antigos que não mudassem e os novos fragmentos. Todos os fragmentos estão em uma ordem específica chamada BSN. A partir do BSN mais baixo para o BSN mais alto para um "mapa de fluxo". Esses fragmentos são então colocados juntos (menos os fragmentos de configuração) para recriar o arquivo e, em seguida, passou de volta para o cliente de chamada Algumas classes importantes para observar no modelo de objeto:

SPFILESTREAMMANAGER - Responsável por computar os fluxos (computestreamstowrite)

SPFILESTREAMSTORE - Salva o SPHostBlobs de volta ao banco de dados (putblobs) e recebe blobs do banco de dados (getblobs *)

Ao usar os clientes do Office completo, os arquivos completos são enviados para o SharePoint (somente se a primeira chamada para Cellstorage.svc falhar ... continue lendo abaixo). Isso é feito fazendo um http colocado na URL do documento. O SharePoint através de suas aulas de cobalto (Cobaltstream que deriva das classes Core Cobalt) é responsável por fazer a trituração e comparações reais. Eu não vi o cliente do Office (2010 ou 2013), fazer qualquer tipo de economia inteligente de documentos com base em PackageParts em arquivos do Office (novamente isso funciona se a primeira chamada for bem-sucedida). Eu confirmei que os fragmentos são gerados, não importa o tipo de arquivo. Isso me faz pensar que a trituração é um pouco aleatória (até o limite padrão 64K para um shred) e não vai pegar tudo perfeitamente (eu

E metade da mudança em um fragmento e metade da mudança em outro fragmento em vez de um componente desfiado). Eu tentei ver se consegui descobrir como a trituração estava funcionando, mas as coisas ficam muito loucas quando você entra nas aulas de cobalto porque suas são muitas classes abstratas que estabelecem.

Update: Veja esta postagem de blog para minhas experiências mais recentes com edição com clientes do Office e atualização inteligente (funciona) ...

Voltar para um dos pontos acima. Não consegui obter os clientes do Office (2010 ou 2013) para fazer qualquer tipo de atualização inteligente como mencionado no post do Bill (com Word e PowerPoint com uma construção de clientes específica). Em outras alas, eu só queria enviar as mudanças que fiz para o SharePoint. Eu nunca tinha realmente testado isso antes e estava ansioso para vê-lo em ação, mas infelizmente não parece fazer isso. Eu estou supondo apenas em um modo de edição multiusuário (OWA?) Você verá esse tipo de recurso que está sendo utilizado (atualização: e esse palpite estava correto! Veja abaixo!). Assim como um FYI, aqui está o que eu fiz com escritório e chamadas do SharePoint OM:

usou nosso incrível amigo Fiddler para monitorar o tráfego Carregou um arquivo do PowerPoint para o SharePoint Abriu o PowerPoint no cliente do PowerPoint Removido um slide do powerpoint, salvado Office envia o arquivo inteiro para o SharePoint (é visível no cabeçalho de tamanho de conteúdo da solicitação de put que este é o caso) O SharePoint faz o trituração e cria novos fragmentos Coloque o slide de volta em (ctrl-z), salve o arquivo, novamente o arquivo inteiro é enviado Uma nova versão e fragmentos semelhantes são criados, mas alguns são retidos a partir da primeira atualização de upload \ segundo

Se alguém sabe como obter este trabalho de forma confiável com os clientes do Office e o SharePoint OM, por favor me avise. Caso contrário, vou ter que dizer que estamos sendo escondidos nesta "delta" muda do cliente de escritório não-sentido e não há otimização de rede acontecendo entre o cliente do Office e o WFE. Nesse cenário, o armazenamento desfiado é realmente apenas nos poupar alguns bytes aqui e ali (se o controle de versão estiver ligado), o que reduz o número de gravações, mas ao custo de mais "leituras" e CPU para reconstruir os arquivos. .

UPDATE: Office Web Apps e armazenamento triturado - é aí que você verá a otimização de fio entre o cliente (OWA) e o WFE. Funciona assim. Quando uma solicitação de um arquivo é feita a partir do SharePoint, o OWA solicitará ao WFE para dar-lhe o arquivo. O arquivo será construído pelo WFE a partir dos fragmentos. Quando dois usuários abrem o arquivo para edição, um novo tipo de recipiente de shred é criado chamado "partição". Esta partição contém tireds que cada usuário está trabalhando. É aqui que os fragmentos se dividem às pequenas peças XML. Como cada parte de um documento é alterada, novas partições são criadas. Quando alguém quer ver o que outra pessoa fez, eles solicitarão essa nova partição e ela (e apenas) será enviada para o cliente. Quaisquer alterações feitas também são enviadas individualmente e o arquivo inteiro não é.

Então, onde isso nos coloca? Aqui está a realidade e os detalhes corretos sobre armazenamento desfiado (como cada blog no armazenamento desfiado está errado na Internet). Você tem que testar o armazenamento triturado com 3 coisas em mente para ver se você realmente está recebendo quaisquer benefícios (se o armazenamento ou a rede baseado).

Com a versão ligada (você ganha o benefício de armazenamento, sem ele, você não ganha nenhum benefício de armazenamento) Com o Office Web Apps (você ganha o cliente para o Otimização de Rede WFE e o efeito de "particionamento" na edição de utilizador de mutil Ao usar os clientes do Office ou do SharePoint, não importa o que, você obtenha um wfe para o otimização de rede do SQL Server somente ao escrever um documento de volta (no entanto, não há um benefício de fio entre os clientes do Office e do SharePoint e o WFE quando a primeira chamada falha à Celulares. svc)

http://blogs.architectingconnectedsystems.com/blogs/cjg/21/2012/12/21/How-shredded-storage-really-works-in-sp2013.aspx

armazenamento triturado.

Mais um esclarecimento sobre o uso de distintos para resolver o erro ORA-30926 no caso geral:

Você precisa garantir que o conjunto de dados especificados pela cláusula usando () não tenha valores duplicados do Junte -se a colunas, ou seja colunas na cláusula on ().

No exemplo da OP, em que a cláusula de uso seleciona apenas uma chave, foi suficiente adicionar distinto à cláusula de uso. No entanto, no caso geral, a cláusula de uso pode selecionar uma combinação de colunas de chave para corresponder e atribuir colunas a serem usadas na cláusula de atualização ... Portanto, no caso geral, adicionar distinto à cláusula de uso ainda permitirá diferentes linhas de atualização para as mesmas chaves; nesse caso, você ainda receberá o erro ORA-30926.

Esta é uma elaboração da resposta e do ponto 3.1 do DCookie na resposta de Tagar, que da minha experiência pode não ser imediatamente óbvia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top