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-5189

Oleg Dok's questions

Martin Hope
Oleg Dok
Asked: 2015-01-22 00:03:37 +0800 CST

Por que e como às vezes recebo o "erro de tabela ausente" enquanto há definitivamente um bloqueio Sch-M?

  • 7

Tenho um teste sintético, que reproduz algum erro que temos no ambiente de produção. Aqui estão os 2 scripts para reproduzi-lo:

1º

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;
SET NOCOUNT ON;
IF @@TRANCOUNT > 0 ROLLBACK
IF object_id('test') IS NOT NULL 
    DROP TABLE test
IF object_id('TMP_test') IS NOT NULL 
    DROP TABLE TMP_test
IF object_id('test1') IS NOT NULL 
    DROP TABLE test1
CREATE TABLE test(Id INT IDENTITY PRIMARY KEY)
GO
INSERT test DEFAULT VALUES
GO 2000
WHILE 1 = 1
BEGIN
    CREATE TABLE TMP_test(Id INT PRIMARY KEY)
    INSERT TMP_test SELECT * FROM test

    WAITFOR DELAY '0:00:00.1'
    BEGIN TRAN

    EXEC sp_rename 'test', 'test1'
    EXEC sp_rename 'TMP_test', 'test'
    EXEC sp_rename 'test1', 'TMP_test'


    DROP TABLE TMP_test
    commit
END

2º

SET NOCOUNT ON;

DECLARE @c INT
WHILE 1 = 1
BEGIN
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK

    /* and repeat this 10-20 times more*/
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK
END

Então, o problema é que quando executo o 1º script em uma sessão e deixo rodando, e depois executo o 2º em sessão separada, posso obter este tipo de erro:

Msg 208, Nível 16, Estado 1, Linha 13 Nome de objeto inválido 'Teste'.

A questão é - POR QUE vejo esse erro no caso de haver um COMMITno final do ciclo do primeiro script e nunca recebo um se houver um ROLLBACK?

Tenho a sensação de que está de alguma forma conectado à situação, quando o script é confirmado, ainda há a tabela com o nome test, mas é um objeto diferente e o segundo script precisa se recompilar. E tudo bem. Mas por que ele recebe o erro de tabela perdida? AFAIK - quando eu renomeio a tabela dentro de uma transação - ela mantém o bloqueio Sch-M no final da transação?

Alguém pode responder ou me guiar para os artigos técnicos que posso ler profundamente e entender o motivo?

sql-server sql-server-2005
  • 1 respostas
  • 249 Views
Martin Hope
Oleg Dok
Asked: 2012-01-10 00:52:14 +0800 CST

SQL Server: conselho de chaves primárias para meu whitepaper necessário

  • 0

Estou cansado de explicar a cada novo desenvolvedor júnior em nossa equipe de P&D por que ele deve usar chaves primárias e como fazer isso. Então decidi escrever um pequeno whitepaper, que todo novo desenvolvedor deveria ler. Aqui está o rascunho dele.

AVISO LEGAL:

  1. Eu sei e entendo a diferença entre índice clusterizado e chave primária
  2. Na pergunta a seguir PRIMARY KEY significa PRIMARY KEY CLUSTERED, e SEM PRIMARY KEY significa SEM PK E CLUSTERED INDEX
  3. Observe que é um whitepaper para programadores juniores e não SQL
  4. Todas as coisas que eles fazem - revisadas antes de entrar no ramo principal de desenvolvimento
  5. Não vou explicar a eles - quando haverá benefício em usar o índice clusterizado e a chave primária NÃO clusterizada - caso contrário, cairei no inferno das otimizações prematuras

A questão é - o que mais devo adicionar ao documento? Pode ser - o que devo mudar nele? E o que explicar mais detalhadamente?

Aqui vem o rascunho:

  • As chaves primárias precisam restringir qualquer tabela no banco de dados.
  • Sem PK, uma tabela considerada como um heap e o SQL Server tem usos muito limitados desse tipo de dados - a única coisa que devo dizer que é adequada - um buffer para carregamento rápido de dados em massa de fora do mecanismo do SQL Server.
  • Evite usar chaves primárias naturais. Principalmente por causa de suas distribuições naturais (gauss). Por exemplo, na tabela PhoneBook com chave primária baseada em Família e Nome haverá muitos Smiths e Wilsons e muito menos Zimmerbergs e isso indica que páginas contendo Smiths e Wilsons serão divididas com mais frequência do que outras páginas e consultadas também com mais frequência - o que multiplica o impacto no desempenho. Isso leva à degradação do desempenho, devido ao preenchimento da página da chave primária e a maioria das pesquisas atingirá as páginas esparsas do PK.

Além disso, mesmo usando SSN ou ID Number, que têm (espero) distribuição plana, como PK não resolve o problema de divisão de página do PK, porque esses números não estão em nenhuma ordem organizada.

  • Secundário - PKs naturais são frequentemente compostos. Isso cria chaves estrangeiras compostas e índices amplos e, como resultado, prejudica o desempenho. Então, ...
  • Evite usar PKs compostos. Melhor usar PK substituto simples e índice UNIQUE composto, do que PK composto completo, porque leva a FK composto e índices amplos devido à declaração de que todo índice secundário na tabela com PK deve incluir PK inteiro.
  • Evite usar chaves primárias substitutas diferentes dos tipos inteiro ou identificador único
  • Durante a fase de projeto do banco de dados, é muito importante identificar as entidades e tabelas correspondentes que podem ter em perspectiva "zilhões" de linhas, ou tabelas cujas chaves devem ser NÃO APENAS únicas em toda a tabela, mas únicas no banco de dados ou mesmo no mundo, ou que devem ser unido a outras tabelas por esta chave em várias tabelas de salto - é melhor esta tabela ter UUID PK, outras - inteiro comum, porque o SQL Server está muito bem ajustado para usar PKs inteiros.
  • Esses dois tipos podem garantir tanto a distribuição vetorial (IDENTITY ou NEWSEQUENTIALID()) quanto a sequência monótona.
  • Regra principal de design do banco de dados - Vinte minutos gastos em um design bem pensado economizarão dias ou até semanas durante a manutenção do banco de dados de produção
sql-server database-design
  • 3 respostas
  • 1035 Views
Martin Hope
Oleg Dok
Asked: 2012-01-07 02:34:17 +0800 CST

Eu estava certo com o bloqueio?

  • 6

Em relação a esta pergunta que eu quero fazer

Comparando duas consultas:

(1)
DELETE dbA.dbo.tableA
FROM dbA.dbo.tableA a WITH(NOLOCK)
JOIN dbB.dbo.tableB b WITH(NOLOCK)
  ON 
      b.colA = a.colA
  AND b.colB = a.colB

e

(2)
DELETE FROM dbA.dbo.tableA 
WHERE EXISTS
(
  SELECT *
  FROM dbB.dbo.tableB b WITH(NOLOCK) 
  where
      b.colA = dbA.dbo.tableA .colA 
  AND b.colB = dbA.dbo.tableA .colB 
) 

é claro que as consultas fazem um trabalho semelhante, se não considerarmos gravações simultâneas que podem levar a leituras sujas.

MAS eu tenho uma dúvida

eu estava certo com o seguinte comentário?

observe que será colocado um bloqueio compartilhado (atualizável?) @ tableA desde o início da instrução (2), em vez de duas tabelas NOLOCK na junção (1), que colocará o primeiro bloqueio - bloqueio UX somente depois disso será encontrada a primeira linha para deletar

sql-server sql-server-2005
  • 1 respostas
  • 208 Views
Martin Hope
Oleg Dok
Asked: 2012-01-06 05:49:18 +0800 CST

Solução alternativa de limpeza de fantasma congelada do SQL Server necessária

  • 15

Tenho várias tabelas com quantidade de linhas entre 5M e 1,5G

Cada tabela possui seu campo BLOB, cujo tamanho varia de 100 bytes a 30 MBytes e que é armazenado como 'tipos de valor grande fora da linha' = ON

As tabelas são armazenadas em grupos de arquivos diferentes com 3-4 arquivos cada um em discos diferentes em LUNs diferentes em SAN muito rápida

Todos os dias, essas tabelas crescem para 5-100 Gb de tamanho e com 600k - 1,5M de linhas

Após um certo período de tempo , que varia de 2 semanas a 6 meses, algumas das linhas são excluídas ou movidas para o banco de dados de arquivo, portanto, não há linhas nas tabelas de trabalho com mais de 6 meses.

Configuração atual do servidor:

  • O mecanismo do servidor SQL é 2008 R2 SP1 Enterprise @ 24 núcleos, @ 64 Gb RAM
  • O SQL Server é executado com sinalizadores de inicialização extras:

-T 3640; (Elimina o envio de mensagens DONE_IN_PROC para o cliente para cada instrução no procedimento armazenado. Isso é semelhante à configuração de sessão de SET NOCOUNT ON, mas quando definido como um sinalizador de rastreamento, cada sessão do cliente é tratada dessa maneira)

-T 1118;(Alterna as alocações no tempDB de 1pg por vez (para as primeiras 8 páginas) em uma extensão.)

-T 2301;(Permite otimizações avançadas que são específicas para consultas de suporte à decisão. Esta opção se aplica ao processamento de suporte à decisão de grandes conjuntos de dados)

-T 1117;(Cresce todos os arquivos de dados de uma vez, caso contrário, ele será alternado.)

-E; (Aumenta o número de extensões alocadas para cada arquivo em um grupo de arquivos. Essa opção pode ser útil para aplicativos de data warehouse que possuem um número limitado de usuários executando varreduras de índice ou dados)

-T 834; (Faz com que o SQL Server use alocações de página grande do Windows para a memória alocada para o buffer pool, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com/kb/920093 )

  • O SQL Server usa extensões de página grandes
  • O SQL Server utiliza a opção de inicialização rápida de arquivo
  • AUTOSHRINK está DESLIGADO para todos os bancos de dados

O problema é que, a partir de algum ponto do tempo de atividade do servidor (de alguns dias a meses) GHOST CLEANUP, o processo se recusa a realizar limpezas forçadas e simplesmente faz seu trabalho normal - limpa várias páginas em vários segundos ( which is seen thru Extended Events), o que não é adequado , porque não é capaz de limpar todas as linhas excluídas

O problema persiste desde os tempos do SQL Server 2005 RTM Enterprise

Como tentei resolver o problema:

  • Tentou forçar operações SCAN em índices clusterizados das tabelas
  • Tentou forçar operações SCAN, que envolvem todo o conteúdo da coluna BLOB em índices clusterizados das tabelas
  • sistema sp_clean_db_free_space & sp_clean_db_file_free_space
  • manualmente dbcc cleanpage(@dbid, @fileid, @page) para todos os arquivos e páginas no banco de dados
  • reconstruções e reorganização de índice clusterizado
  • recriando banco de dados
  • DBCC FORCEGHOSTCLEANUP

  • Quando executo a consulta:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
    

    Vejo milhões e dezenas de milhões de registros fantasmas, mas apenas para o tipo de unidade de alocação de LOB_DATA

As únicas coisas que ajudam:

  • parando o servidor com o comando SHUTDOWN ou reiniciando todo o host - ajuda, após reiniciar o processo GHOST CLEANUP é executado por algumas horas e realmente limpa todos os registros fantasmas
  • DBCC SHRINKFILE com opção EMPTYFILE - mover todos os dados de um arquivo para outro ou arquivos recém-criados limpa registros fantasmas apenas neste arquivo - o problema é que eu realmente odeio operações de redução. E isso leva de 3 a 4 dias para UM arquivo

a pergunta - existe alguma maneira programática (preferível) ou de manutenção para forçar o GHOST CLEANUP sem tempo de inatividade do servidor, porque o tempo de inatividade do servidor custa muito, até mesmo inaceitável - é de milhares a dezenas de milhares de dólares por hora

Problemas foram notados como os meus estão aqui:

  • http://support.microsoft.com/kb/932115
  • http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx

E o mesmo está aqui:

  • http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/c023e51c-92ad-471b-89a6-8c93732ee6cb/
sql-server sql-server-2008-r2
  • 2 respostas
  • 8085 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