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

Triynko's questions

Martin Hope
Triynko
Asked: 2019-09-06 09:48:07 +0800 CST

Quando a opção IGNORE_DUP_KEY deve ser usada em um índice?

  • 7

Alguém disse que é preferível criar suas consultas para evitar exceções de chave duplicadas, mas não estou convencido de que seja mais eficiente do que apenas definir IGNORE_DUP_KEY = ONo índice.

Meu objetivo é garantir que uma linha ou conjunto de linhas exista para um ou mais usuários antes de tentar atualizar essas linhas. Eu faço isso para que, quando tento atualizar a linha com uma instrução de atualização como a abaixo, e nenhuma linha seja afetada, é porque a [Count]parte do predicado não foi satisfeita, ao contrário da linha que não existe (ou seja, a [ID]parte do predicado não sendo satisfeita):

UPDATE [Inventory]
SET [Count] = [Count] + 1
WHERE [ID] = 3 
AND ([Count] + 1) <= @MaxInventory

Eu poderia executar EXISTS(SELECT 1 From [Inventory] WHERE [ID] = 3para verificar essa única linha e inserir a linha apenas se ela não existir. Isso simplesmente evita inserções desnecessárias. A inserção, se necessário, ainda teria que lidar com transações simultâneas, portanto, exceções de chave duplicada ainda podem ocorrer.

Estou curioso para saber se é mais eficiente apenas ativar IGNORE_DUP_KEYneste cenário, em vez de permitir que o erro seja lançado e capturado. Especificamente, estou curioso para saber se é tão rápido ou possivelmente ainda mais rápido do que executar uma verificação existente, apenas para tentar inserir o registro e deixá-lo ignorar chaves duplicadas.

Isso se torna ainda mais importante quando estou verificando e inicializando vários registros ao mesmo tempo. Por exemplo, se eu precisar garantir que os registros de milhares de usuários existam em uma única instrução de atualização, a lógica seria muito mais simples se eu apenas executasse essa instrução de inserção antecipadamente, permitindo que ela ignorasse chaves duplicadas. Evitar duplicatas seria mais complexo, porque eu teria que primeiro consultar a tabela para a qual os registros não existem e, em seguida, tentar adicionar apenas esses registros (novamente, ignorando as chaves duplicadas). Apenas inserir pode ser mais rápido, mesmo que todos os registros existam.

Eu poderia encontrá-lo no meio do caminho e verificar se algum dos registros está faltando, como com uma junção à esquerda ou uma COUNTcomparação, mas por que se preocupar se a inserção ignorando chaves duplicadas é apenas mais rápida?

É uma boa ideia usar IGNORE_DUP_KEYe apenas tentar inserções em vez de se preocupar em verificar a existência de linhas antes do tempo? Se não, por quê?

sql-server unique-constraint
  • 3 respostas
  • 2029 Views
Martin Hope
Triynko
Asked: 2019-07-02 08:54:12 +0800 CST

Melhor maneira de configurar e manter uma tabela com muitas inserções e exclusões em média?

  • 5

Existe uma tabela de "consulta em lote" que possui duas colunas (BatchID, RecordID) que são ambas do tipo TSQL 'uniqueidentifier'. A chave de cluster exclusiva está ativada (BatchID, RecordID) e não há índices secundários.

Usamos SqlBulkCopy para inserir rapidamente milhares ou milhões de IDs na tabela em um único ID de lote, para que várias consultas possam se unir a ele para realizar a filtragem usando esse conjunto de IDs de registro associados a esse lote. Essa abordagem é muito mais rápida do que tentar várias consultas que enviam listas de IDs na string de consulta. Assim que as consultas forem concluídas, o lote de IDs de registro será excluído. A tabela fica vazia em média quando nenhuma consulta está em execução, mas pode ter centenas de lotes ativos, pois processamos milhares de solicitações de API por segundo que podem usar a tabela.

Minha pergunta é, que tipo de etapas de manutenção, se houver, são exigidas de um DBA para manter essas tabelas. Por exemplo, ele se beneficiaria da reconstrução periódica do índice ou o SQL Server lidaria com a limpeza das linhas excluídas (liberando blocos de página etc.) sozinho. Além disso, existe alguma configuração especial da tabela ou índice clusterizado que ajudaria, especialmente considerando que os identificadores são Guids aleatórios (identificadores exclusivos).

Geralmente usamos a versão mais recente do SQL Server, Enterprise Edition. Alguns servidores estão no Azure, alguns na AWS.

Também estou interessado em ouvir alternativas. Por exemplo, suponho que essa abordagem seja melhor com uma tabela permanente, mas também posso criar uma tabela temporária local de sessão como parte de uma transação que é excluída quando concluída, em vez de inserir e excluir linhas de uma tabela permanente. Só não sei como isso funcionaria em comparação.

sql-server performance
  • 2 respostas
  • 135 Views
Martin Hope
Triynko
Asked: 2017-04-01 12:29:59 +0800 CST

Por que o TSQL retorna o valor errado para POWER(2.,64.)?

  • 14

select POWER(2.,64.)retorna 18446744073709552000em vez de 18446744073709551616. Parece ter apenas 16 dígitos de precisão (arredondando o 17º).

Mesmo tornando a precisão explícita select power(cast(2 as numeric(38,0)),cast(64 as numeric(38,0))), ela ainda retorna o resultado arredondado.

Esta parece ser uma operação bastante básica para que ela esteja lascando arbitrariamente em 16 dígitos de precisão como esta. O máximo que ele pode calcular corretamente é apenas POWER(2.,56.), falhando por POWER(2.,57.). O que está acontecendo aqui?

O que é realmente terrível é que select 2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.*2.;realmente retorna o valor correto. Tanto para concisão.

sql-server azure-sql-database
  • 4 respostas
  • 1878 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