Pergunta

Eu recentemente comecei a trabalhar em uma empresa com uma aplicação enorme "enterprisey". No meu último emprego, eu projetei o banco de dados, mas aqui temos um banco de dados departamento inteiro Arquitetura que eu não sou parte.

Uma das coisas mais estranhas em sua base de dados é de que eles têm um monte de pontos de vista que, em vez de ter o usuário fornecer a data varia eles querem ver, juntar-se com uma mesa (global temporária) "TMP_PARM_RANG" com um início e data final. Cada vez que o aplicativo principal começa a processar um pedido, a primeira coisa que ele faz isso "DELETE FROM TMP_PARM_RANG;" em seguida, uma inserção nele.

Esta parece ser uma maneira bizarra de fazer as coisas, e não muito segura, mas todo mundo aqui parece ok com ele. Isso é normal, ou é minha inquietação válido?

Atualização Eu devo mencionar que eles usam transações e bloqueios por cliente, por isso é protegida contra a maioria dos problemas de concorrência. Além disso, existem literalmente dezenas se não centenas de pontos de vista que todos dependem TMP_PARM_RANG.

Foi útil?

Solução

Do que eu entendi corretamente?

Há uma vista como esta:

SELECT * FROM some_table, tmp_parm_rang
  WHERE some_table.date_column BETWEEN tmp_parm_rang.start_date AND tmp_parm_rang.end_date;

Então, em alguns frontend um usuário inputs um intervalo de datas, eo aplicativo faz o seguinte:

  1. Apaga todas as linhas existentes de TMP_PARM_RANG
  2. Insere uma nova linha na TMP_PARM_RANG com os valores do usuário
  3. Seleciona todas as linhas da vista

Gostaria de saber se as alterações TMP_PARM_RANG está confirmada ou revertida, e em caso afirmativo, quando? É uma tabela temporária ou uma tabela normal? Basicamente, dependendo das respostas a estas questões, o processo pode não ser seguro para vários usuários para executar em paralelo. Espera-se que se este fosse o caso já teriam descoberto isso e dirigiu-lo, mas quem sabe?

Mesmo se for feito de uma forma thread-safe, de fazer alterações no banco de dados para operações de consulta simples não faz muito sentido. Essas exclusões e inserções estão gerando refazer / desfazer (ou qualquer que seja o equivalente está em um banco de dados não-Oracle) que é completamente desnecessário.

Uma maneira simples e mais normal de realizar o mesmo objetivo seria para executar esta consulta, ligando as entradas do usuário para os parâmetros de consulta:

SELECT * FROM some_table WHERE some_table.date_column BETWEEN ? AND ?;

Outras dicas

Se o banco de dados for Oracle, é possivelmente uma tabela temporária global; cada sessão vê a sua própria versão da tabela e inserções / exclusões não afetarão outros usuários.

Deve haver alguma razão comercial para esta tabela. Eu vi pontos de vista com datas hardcoded que eram, na verdade, uma visão partioned e eles estavam usando datas como o campo partioning. Eu também vi juntar em uma mesa como quando se lida com daylights poupança vezes imaginar uma visão que voltou toda a atividade que ocorreu durante o horário de verão. E nenhuma dessas coisas jamais apagar e inserir na tabela ... isso é apenas estranho

Assim, ou há uma razão mais profunda para isso que precisa ser cavado, ou é apenas algo que na época parecia uma boa idéia, mas por que foi feito dessa forma foi perdido como conhecimento tribal.

Pessoalmente, eu estou supondo que seria uma ocorrência muito estranho. E pelo que você está dizendo dois métodos que chamam o processo, ao mesmo tempo pode ser muito interessante.

Normalmente intervalos de datas são feitas como filtros em uma visão, e não impulsionada por valores fora armazenados em outras tabelas.

A única justificativa que eu podia ver para isso é se houve um processo de várias etapas, que só foi executada uma vez em um tempo e as datas são necessárias para várias operações, em vários procedimentos armazenados.

Suponho que iria deixá-los suportar múltiplas faixas. Por exemplo, eles podem retornar todas as datas entre 1/1/2008 e 1/1/2009 E 1/1/2006 e 1/1/2007 para comparar os dados de 2006 com os dados de 2008. Você não poderia fazer isso com um único par de parâmetros vinculados. Além disso, eu não sei como a Oracle faz isso de consulta cache plano para vistas, mas talvez isso tenha algo a ver com isso? Com as colunas de data a ser verificado como parte da visão o servidor pode armazenar em cache um plano que assume sempre as datas serão verificados.

Apenas jogando fora algumas suposições aqui:)

Além disso, você escreveu:

Eu devo mencionar que eles usam transações e bloqueios per-cliente, para ela é guardada contra a maioria de concorrência problemas.

Enquanto que pode proteger contra problemas de consistência de dados, devido à concorrência, dói quando se trata de problemas de desempenho devido à concorrência.

Será que eles também adicionar um -no aplicação- para gerar o próximo valor único para a chave primária?

Ao que parece, o conceito de estado compartilhado ilude essas pessoas, ou a razão para os ilude estaduais compartilhados nós.

Isso soa como um algoritmo muito estranho para mim. Eu me pergunto como ele lida com a concorrência - é envolvido em uma transação?

Parece-me que alguém apenas não tinha certeza de como escrever sua cláusula WHERE.

As vistas são provavelmente usados ??como tabelas temporárias. No SQL Server, podemos usar uma variável de tabela ou uma tabela temporária (# / ##) para esta finalidade. Embora a criação de pontos de vista não são recomendados por especialistas, criei muitos deles para meus projetos SSRS porque as tabelas que eu estou trabalhando em não fazer referência um ao outro (NO FK, a sério!). Eu tenho a deficiências solução no projeto de banco de dados; É por isso que eu estou usando pontos de vista muito.

Com a abordagem global GTT tabela temporária que você comentário está sendo usado aqui, o método é certamente seguro em relação a um sistema multiusuário, não há problema nenhum. Se este é o Oracle então eu gostaria de verificar se o sistema quer é usar um nível adequado de dinâmica de amostragem para que o GTT é acompanhado de forma adequada, ou que uma chamada para DBMS_STATS é feita para as estatísticas de abastecimento do GTT.

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