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 / 330855
Accepted
Adrian
Adrian
Asked: 2023-09-04 15:24:45 +0800 CST2023-09-04 15:24:45 +0800 CST 2023-09-04 15:24:45 +0800 CST

Devo me preocupar com um plano de execução de atualização serial?

  • 772

Para um projeto .Net maduro que apoio, estamos atualmente explorando opções para remover o Entity Framework Core do projeto, mantendo algumas das funcionalidades do EF nas quais confiamos.

No topo desta lista está a nossa capacidade de acompanhar exatamente quais valores foram alterados como resultado de uma solicitação de atualização que um sistema externo nos envia - não temos controle sobre esse sistema e não é incomum recebermos atualizações solicitações que contêm dados idênticos várias vezes.

Atualmente, usamos o rastreador de alterações da EF para verificar se a atualização que estamos processando realmente faz alguma alteração em um conjunto de colunas específicas, para que possamos saber se devemos ou não informar nossos usuários sobre essas alterações.

Analisar como poderíamos conseguir isso sem ter o EF e sua sobrecarga envolvidos me levou à cláusula OUTPUT do SQL Server , que teoricamente nos permitiria realizar uma atualização em uma tabela e retornar uma visão do estado anterior e atualizado das colunas-chave que use para gatilhos de notificações.

Até aí tudo bem, porém, há um aviso na seção Paralelismo desse documento que diz que "[uma] OUTPUTcláusula que retorna resultados ao cliente, ou variável de tabela, sempre usará um plano serial". Receio que meu conhecimento de SQL não seja forte o suficiente neste momento para saber se isso é um problema ou não.

Isso deveria me preocupar do ponto de vista de desempenho ou confiabilidade? Cada atualização que realizamos é codificada em um conjunto de colunas que formam (em quase todos os casos) uma chave composta exclusiva, portanto, mesmo que a parte da consulta da atualização seja executada em série, haveria um impacto perceptível?

Tomemos como exemplo o seguinte esquema:

CREATE TABLE user_profile
(
  [id] INT IDENTITY (1,1) NOT NULL PRIMARY KEY
  [username] NVARCHAR(100) NOT NULL,
  [tenancy] NVARCHAR(20) NOT NULL,
  [city] NVARCHAR(50) NULL,
  [state] NVARCHAR(50) NULL,
  [first_name] NVARCHAR(50) NULL,
  [last_name] NVARCHAR(50) NULL,
  [external_system_access_key] NVARCHAR(200) NULL,
  CONSTRAINT [UX_user] UNIQUE ([username], [tenancy])
)

Neste exemplo, um usuário gerencia seus próprios valores city, statee , mas um sistema externo gerencia por meio de uma solicitação ao nosso serviço first_name, comolast_nameexternal_system_access_key

POST /{tenancyId}/user/{username}/profile/external

{
  "accessKey": "1224567890"
}

Se recebermos a mesma atualização várias vezes sem que o valor seja accessKeyalterado, queremos saber se o valor difere antes e depois da execução da atualização, para sabermos se devemos ou não informar ao usuário que a chave foi alterada. Cada solicitação resultaria em uma atualização como esta:

DECLARE @accessKey NVARCHAR(200) = '1234567890';
DECLARE @username NVARCHAR(100) = 'username';
DECLARE @tenancy NVARCHAR(20) = 'tenancy';
UPDATE [user_profile]
SET [remote_system_access_key] = @accessKey
OUTPUT INSERTED.id, DELETED.[remote_system_access_key] AS OLD_remote_system_access_key, INSERTED.[remote_system_access_key] AS NEW_remote_system_access_key
WHERE 
[username] = @username AND [tenancy] = @tenancy;

No caso em que a solicitação nos fornecesse um novo valor para essa coluna, haveria valores diferentes para cada uma das colunas de saída OLD_e NEW_, se for uma solicitação que tivemos anteriormente, eles corresponderão, permitindo-nos avaliar quaisquer alterações após a solicitação. a inserção está concluída.

Mas a documentação do SQL Server diz que isso sempre resultará em um plano de execução serial. O que preciso saber é: isso é um problema? Qualquer assistência que eu pudesse obter para entender isso e seus impactos potenciais seria muito apreciada.

Geralmente, cada atualização atingirá apenas uma linha por vez, pois sua cláusula where usa uma chave composta exclusiva. Estamos apenas tentando evitar o que o EF faz e exigir a consulta dos dados primeiro - em vez disso, como o SQL Server já fornece um mecanismo para saber qual era o estado antes e depois da atualização, gostaríamos de recuperar esses dados depois se isso não causar problemas de desempenho.

O exemplo que usei acima é bastante simplista comparado aos nossos casos reais, onde atualizaremos um grande número de colunas em cada instrução - todas em uma tabela, mas múltiplas colunas em cada uma. Seria proibitivamente complexo tentar cobrir todas as permutações possíveis do que poderia ser atualizado em cada solicitação.

sql-server
  • 1 1 respostas
  • 48 Views

1 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2023-09-04T22:58:42+08:002023-09-04T22:58:42+08:00

    Devo me preocupar com um plano de execução de atualização serial?

    Quase certamente não neste caso.

    Pelo que vi (das perguntas anteriores do EF), o EF não tem vergonha de adicionar a OUTPUTcláusula às consultas de qualquer maneira, então você pode descobrir que ela já foi executada com isso se você rastrear as consultas.

    Independentemente disso, é improvável que uma atualização singleton onde a linha possa ser encontrada com uma busca UX_userse beneficie do paralelismo ou tenha um custo de plano próximo ao limite de custo para paralelismo onde um plano paralelo seria considerado.

    Talvez fosse possível projetar tal caso fornecendo perversamente chaves estrangeiras para validação sem nenhuma indexação útil (ou seja, onde outra tabela faz referência à coluna que você está atualizando), mas você está em condições de examinar seus planos de execução e ver se isso é o caso.

    Se você quiser aplicar isso onde houver uma possibilidade legítima de que o plano seja paralelo, a solução alternativa será bastante simples. Você pode criar uma #temptabela e OUTPUT INTOaquela e depois SELECTa partir da #temptabela.

    • 3

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

    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