AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-32394

fejesjoco's questions

Martin Hope
fejesjoco
Asked: 2014-05-08 01:09:29 +0800 CST

Como criar um script de alteração de versão DDL/DML para SQL Server?

  • 0

Eu tenho um aplicativo que possui um banco de dados e algumas versões do aplicativo apresentam alterações de esquema. Para facilitar a instalação (?), imaginei que desejaria criar uma metatabela que contém a versão atual do esquema e criar um único script que atualize o esquema de qualquer versão anterior para a versão atual.

Algo assim (pseudocódigo):

if (select v from version) = 1
    create table newtable ...
    update version set v = 2
end
if (select v from version) = 2
    alter table newtable add column newcolumn ...
    update newtable set newcolumn = ...
    update version set v = 3
end
if (select v from version) = 3
    ...
end
...

Existem muitos problemas aqui.

A mistura de DDL e DML pode levar a problemas, como adicionar uma nova coluna e tentar atualizá-la no mesmo lote causará um erro de que a coluna não existe. Então pensei que deveria sempre separá-los em diferentes etapas, e cada etapa deveria ser um lote diferente. Obviamente, cada etapa de alteração terminará em um DML para alterar o número da versão, mas tudo bem. Deve haver transações dentro dos lotes DML e não vamos nos preocupar com os lotes DDL.

Também quero ter certeza de que, durante uma execução, apenas uma etapa seja executada, porque o tratamento de erros pode ser um pesadelo. Parar o script após uma etapa também não é trivial, nem no SSMS nem no SQLCMD. No meu exemplo acima, se começarmos na versão 1, ela será atualizada para a 2, depois para a 3, depois para a 4 etc. Então pensei em inverter a ordem das alterações. Primeiro vem a mudança de 3 para 4, depois de 2 para 3, depois de 1 para 2, desta forma, apenas uma etapa é executada por vez.

Isso parece bom? Há outras coisas a considerar?

sql-server t-sql
  • 2 respostas
  • 2469 Views
Martin Hope
fejesjoco
Asked: 2014-02-19 11:51:44 +0800 CST

Cursor de referência forte do Oracle com sql dinâmico

  • 0

Estou usando o Oracle 10g. Eu tenho uma consulta em um procedimento armazenado que seleciona linhas inteiras de uma tabela. Atualmente, ele retorna um cursor de referência fortemente tipado (tablename%rowtype). Agora tenho que adicionar algumas cláusulas WHERE dinâmicas a esta consulta, mas o SQL dinâmico não oferece suporte a um cursor de referência forte. Já foi perguntado no SO antes . Minha pergunta é: existe uma solução alternativa? Use algum tipo de wrapper ou conversão ou mágica DBMS para converter do cursor fraco para o cursor forte? Posso garantir que os resultados correspondem ao tipo de linha da tabela.

oracle plsql
  • 1 respostas
  • 5295 Views
Martin Hope
fejesjoco
Asked: 2014-01-05 06:25:56 +0800 CST

O Oracle não está usando um índice exclusivo para uma chave longa

  • 16

Eu tenho uma tabela com 250 mil linhas em meu banco de dados de teste. (Existem algumas centenas de milhões em produção, podemos observar o mesmo problema lá.) A tabela possui um identificador de string nvarchar2(50), não nulo, com um índice exclusivo (não é o PK).

Os identificadores são compostos por uma primeira parte que possui 8 valores diferentes em meu banco de dados de teste (e cerca de mil em produção), depois um sinal @ e, finalmente, um número, de 1 a 6 dígitos. Por exemplo, pode haver 50 mil linhas que começam com 'ABCD_BGX1741F_2006_13_20110808.xml@' e são seguidas por 50 mil números diferentes.

Quando eu consulto uma única linha com base em seu identificador, a cardinalidade é estimada em 1, o custo é muito baixo, funciona bem. Quando eu consulto mais de uma linha com vários identificadores em uma expressão IN ou uma expressão OR, as estimativas para o índice estão completamente erradas, então uma verificação completa da tabela é usada. Se eu forçar o índice com uma dica, é muito rápido, a varredura completa da tabela é realmente executada uma ordem de magnitude mais lenta (e muito mais lenta na produção). Portanto, é um problema do otimizador.

Como teste, dupliquei a tabela (no mesmo schema+tablespace) com exatamente o mesmo DDL e exatamente o mesmo conteúdo. Eu recriei o índice exclusivo na primeira tabela para uma boa medida e criei exatamente o mesmo índice na tabela clone. eu fiz um DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);. Você pode até ver que os nomes dos índices são consecutivos. Então agora a única diferença entre as duas tabelas é que a primeira foi carregada em ordem aleatória por um longo período de tempo, com blocos espalhados no disco (em um tablespace junto com várias outras tabelas grandes), a segunda foi carregada como uma em lote INSERIR-SELECIONAR. Fora isso, não consigo imaginar nenhuma diferença. (A tabela original foi reduzida desde a última grande exclusão e não houve uma única exclusão depois disso.)

Aqui estão os planos de consulta para o doente e a tabela clone (as strings sob o pincel preto são as mesmas em toda a imagem e também sob o pincel cinza.):

planos de consulta

(Neste exemplo, há 1867 linhas que começam com o identificador que é preto escovado. Uma consulta de 2 linhas produz uma cardinalidade de 1867*2, uma consulta de 3 linhas produz uma cardinalidade de 1867*3, etc. Não é possível seja uma coincidência, a Oracle parece não se importar com o final dos identificadores.)

O que poderia causar esse comportamento? Obviamente, seria muito caro recriar a tabela em produção.

USER_TABLES: http://i.stack.imgur.com/nDWze.jpg USER_INDEXES : http://i.stack.imgur.com/DG9um.jpg Alterei apenas o esquema e o nome do tablespace. Você pode ver que os nomes da tabela e do índice são iguais aos da captura de tela do plano de consulta.

oracle oracle-11g-r2
  • 3 respostas
  • 2277 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve