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 / dba / Perguntas / 12650
Accepted
Ben Brocka
Ben Brocka
Asked: 2012-02-11 10:53:01 +0800 CST2012-02-11 10:53:01 +0800 CST 2012-02-11 10:53:01 +0800 CST

Por que IDENTITY_INSERT ON é permitido apenas em uma tabela por vez?

  • 772

É o caso que IDENTITY_INSERT só pode ser definido como ON em uma tabela de banco de dados por vez, mas por quê? Como IDENTITYas colunas não são globalmente exclusivas, não consigo pensar em nenhuma situação perigosa que possa ser causada pela inserção de identidades em mais de uma tabela ao mesmo tempo (pelo menos não mais perigoso do que geralmente falsificar IDENTITY INSERT).

IDENTITY INSERT raramente deve ser usado, mas qual é o motivo do limite rígido?

sql-server
  • 2 2 respostas
  • 14131 Views

2 respostas

  • Voted
  1. Best Answer
    JNK
    2012-02-11T11:14:21+08:002012-02-11T11:14:21+08:00

    Acho que é para dificultar. Se você pudesse deixá-lo ligado o tempo todo, por que ter um campo de identidade?

    Na verdade, existem algumas restrições:

    • Persiste apenas nessa conexão
    • Só é configurável em uma tabela por conexão

    Com base nas restrições relacionadas à conexão, acho que é principalmente para que nunca seja acidentalmente deixado ON.

    Imagine se alguém ativou a inserção de ID em uma de suas tabelas, então você não percebeu e uma inserção (normalmente) inválida foi executada que quebrou a integridade do seu campo de ID?

    Lembre-se de que os campos de ID podem ter valores duplicados se não houver restrição ou índice exclusivo em vigor...

    • 12
  2. Olivier S
    2012-02-12T05:11:59+08:002012-02-12T05:11:59+08:00

    Meu palpite é que foi uma restrição devido à implementação. Permitir essa configuração em várias mesas era um potencial golpe de desempenho:

    Como este é um parâmetro de sessão, permitir que a configuração seja ativada em uma única tabela significa que é simples sinalizar e o ID do objeto da tabela para armazenar na sessão, do lado do servidor. Talvez seja apenas um único inteiro: 0 se nenhum IDENTITY_INSERT estiver ativo e alguma codificação de databaseid + objectid para a tabela.

    Permitir que o parâmetro seja definido em várias tabelas dentro de uma sessão significaria que o servidor armazenaria uma lista dinâmica de tais objetos e a verificaria para cada instrução de inserção. Imagine que uma sessão ativa o parâmetro para mil tabelas:

    1. Isso significa que o servidor alocou 1.000 itens na variável de sessão
    2. Isso também significa que o servidor deve verificar a lista de 1.000 itens para cada instrução de inserção nesta sessão.

    Também suspeito que definir identity_insert on tenha um impacto geral no desempenho do servidor. No sybase havia um " fator de configuração de queima de identidade ", que permitia salvar o valor do contador de identidade de uma tabela para ser salvo apenas de vez em quando (o valor é mantido na memória e gravado no disco de vez em quando e no servidor desligar ). O SQL Server é baseado no mesmo código, então provavelmente tem alguma otimização comparável, mas ativar identity_insert em uma tabela provavelmente restringe o servidor a salvar o valor de identidade para cada inserção, porque senão não pode garantir um tamanho máximo de intervalo. Portanto, se uma sessão causar um impacto no desempenho nas inserções em uma tabela, isso provavelmente é aceitável, mas não se puder causar um impacto no desempenho em todas as tabelas auto_increment no servidor.

    • 6

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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