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

Cade Roux's questions

Martin Hope
Cade Roux
Asked: 2024-12-18 02:06:52 +0800 CST

Verificando a validade dos sinônimos entre bancos de dados

  • 9

Fundo:

Tenho vários produtos de sistema de origem, cada um em seu próprio banco de dados, que têm dependências muito limitadas entre si, e que são bastante modulares e também meio opcionais. Eles estão potencialmente em diferentes níveis de versão em sua própria manutenção.

Tenho um banco de dados de sistema de coleta de dados separado que reúne informações de uso de outros sistemas, e gostaria que ele continuasse a ser geralmente compatível com versões anteriores e posteriores dos outros sistemas. Este sistema é todo interno ao banco de dados - trabalhos agendados, procs etc. Nenhum programa externo do Windows, serviços etc.

Idealmente, os sistemas de origem exporiam interfaces consistentes e gerenciariam o que eles próprios expõem de uma forma à prova do futuro, e eu tento utilizar isso sempre que possível. Mas sempre há exceções ao que os roteiros dos outros produtos são capazes de acomodar. Eu gostaria que versões mais recentes do sistema de coleta de dados funcionassem, independentemente de uma tabela (ou tabelas) existir ou não no sistema de origem, e simplesmente anotar isso ou ignorá-lo ou registrá-lo conforme apropriado se não for apropriado para ser usado. Se esse sistema for atualizado mais tarde, não quero necessariamente ter que tocar no sistema de coleta de dados. Portanto, nenhum procs deve ter que ser alterado ou recriado.

Geralmente usamos sinônimos para cada sistema de origem para que a renomeação do banco de dados seja realizada no menor número possível de lugares (de preferência apenas nos sinônimos).

Eu experimentei um pouco e parece que você pode CREATE SYNONYMpara uma tabela/visão que ainda não existe sem uma falha. E você pode CREATE PROCusar esses sinônimos sem falha também. Então seria possível ter o sistema instalado identicamente no sistema com e sem um dos bancos de dados de origem e deveria ser capaz de rodar sem modificações quando o banco de dados para aquele módulo for instalado (ou removido).

No momento, estou apenas procurando uma maneira de fazer as duas coisas a seguir: saber se os sinônimos apontam para algo e verificar essa coisa e garantir que ela atenda a todos os requisitos:

  1. Para saber com segurança se um sinônimo é válido. Quando a primeira coluna aqui é NULL, isso é suficiente para saber que é inválido?

SELECT object_id(base_object_name), * FROM sys.synonyms

  1. Se um sinônimo for válido, há uma maneira de obter os metadados para verificá-lo? As colunas, os tipos de dados podem ser obtidos de sys.columns(ou INFORMATION_SCHEMA), mas isso precisa ser qualificado com um nome de banco de dados conhecido - a resposta abaixo seleciona em uma tabela temporária primeiro e, em seguida, analisa o esquema da tabela temporária. Existe alguma alternativa melhor?

https://stackoverflow.com/a/27126581/18255

sql-server
  • 1 respostas
  • 44 Views
Martin Hope
Cade Roux
Asked: 2021-11-24 13:15:34 +0800 CST

Tempo de execução/custo da função na montagem

  • 1

Eu tenho uma consulta chamando XmlTransform de Microsoft.MasterDataServices.DataQuality em cerca de 1000 linhas ou mais e leva 30s para fazer todo o conjunto (o XSL está em uma variável fixa), existe alguma maneira de ver o tempo real gasto em XmlTransform estava no plano de execução?

https://www.brentozar.com/pastetheplan/?id=H1lXWgoOY

Este ambiente específico é o SQL Server 2012

sql-server performance
  • 2 respostas
  • 65 Views
Martin Hope
Cade Roux
Asked: 2021-07-14 13:41:11 +0800 CST

Detectar qual versão do mecanismo do SQL Server Express está disponível antes da conexão?

  • 0

Eu gostaria de detectar qual versão do mecanismo SQL Server Express está disponível para que eu possa conectar ao (localdb)\v.11 (SQL Server 2012 por https://learn.microsoft.com/en-us/previous- versões/sql/sql-server-2012/hh510202(v=sql.110)?redirectedfrom=MSDN#Anchor_1 ) ou (localdb)\MSSQLLocalDB (SQL Server 2014 e superior por https://learn.microsoft.com/en- us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15&redirectedfrom=MSDN&viewFallbackFrom=sql-server-2014#Anchor_1 ) nome da instância ao tentar anexar um arquivo na string de conexão usando o mecanismo AttachDBFileName=.

Eu provavelmente gostaria de fazer isso no Powershell de alguma maneira, mas qualquer método confiável, posso usar. Eu sei que às vezes uma conexão LocalDB pode ser um pouco lenta, pois anexa o arquivo e inicia sob demanda, então no passado fui bastante tolerante com o tempo limite de conexão para essas conexões LocalDB em comparação com as conexões reais do SQL Server, então Eu preferiria não tentar conectar e esperar o tempo limite, pois acho que já tenho um tempo limite exagerado apenas para uma conexão normal bem-sucedida.

sql-server-localdb
  • 1 respostas
  • 30 Views
Martin Hope
Cade Roux
Asked: 2021-07-01 14:11:52 +0800 CST

SQL Server 2012 equivalente ao recurso AT TIME ZONE

  • 6

Existe uma maneira no SQL Server 2012 de obter qual seria o fuso horário do servidor em uma determinada data/hora? No SQL Server 2016, você tem AT TIME ZONE, mas isso não está disponível em 2012. Eu tenho um datetimeoffsete preciso convertê-lo para o fuso horário do servidor (nessa data) antes de truncá-lo para datetime. SWITCHOFFSETsó funciona se você souber o deslocamento, mas para servidores que alteram seu fuso horário duas vezes ao ano, o deslocamento alternará para frente e para trás.

Esta consulta ilustra o recurso em ação no SQL Server 2016:

SELECT @@SERVERNAME AS [SERVERNAME]
    , GETDATE() AT TIME ZONE 'Central Standard Time' AS [GETDATE() AT TIME ZONE 'Central Standard Time']
    , GETDATE() AT TIME ZONE 'Eastern Standard Time' AS [GETDATE() AT TIME ZONE 'Eastern Standard Time']
    , DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time']
    , DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time']
;

Em junho, pelo menos, os tzoffsets nas duas primeiras colunas diferem das duas últimas colunas porque esse fuso horário "padrão" tem um deslocamento diferente em dezembro do que em junho.

sql-server sql-server-2012
  • 1 respostas
  • 1837 Views
Martin Hope
Cade Roux
Asked: 2020-07-08 05:54:44 +0800 CST

FORMATO 'G17' vs 'G'

  • 7

Tenho uma dúvida sobre este violino:

DECLARE @TestVal AS float = 8.88;
SELECT flt = @TestVal
    , xml = (SELECT Value = @TestVal FOR XML PATH(''), TYPE)
    , fmt17 = FORMAT(@TestVal, 'G17')
    , fmt = FORMAT(@TestVal, 'G')
    , cst = CAST(@TestVal AS nvarchar(50))
    , fmt17_roundtrip = CAST(FORMAT(@TestVal, 'G17') AS float)
    , fmt_roundtrip = CAST(FORMAT(@TestVal, 'G') AS float)
    , cst_roundtrip = CAST(CAST(@TestVal AS nvarchar(50)) AS float)
;

https://dbfiddle.uk?rdbms=sqlserver_2019&fiddle=0cf05f882eb24f53e9484f043af99446

Eu estava tendo problemas com alguns XML saindo por padrão em notação científica que, embora não seja incorreto ou impreciso, não é muito legível.

Eu estava originalmente usando FORMAT(floatcol, 'G17') por causa dos comentários nesta página de documentação que:

Observe que, quando usado com um valor Double, o especificador de formato "G17" garante que o valor Double original seja executado com êxito. Isso ocorre porque Double é um número de ponto flutuante de precisão dupla (binary64) compatível com IEEE 754-2008 que fornece até 17 dígitos significativos de precisão. Recomendamos seu uso em vez do especificador de formato "R", pois, em alguns casos, "R" não consegue executar com êxito valores de ponto flutuante de precisão dupla de ida e volta. O exemplo a seguir ilustra um desses casos.

Bem, hoje descobri que parece adicionar alguns dígitos extras insignificantes à string. Neste exemplo em particular, todos eles "ida e volta" bem, mas o formato G17 tem um dígito extra insignificante.

E apesar do fato de que isso pode não me afetar em uma viagem de ida e volta, eu realmente não quero enviar isso para outra parte com dígitos extras.

Agora estou inclinado a mudar para FORMAT('G'), mas não tenho certeza das implicações disso. Atualmente, a string de formato usada nessas exportações XML é uma definição de configuração armazenada em meu sistema, portanto, é mais fácil continuar usando FORMAT, pois não requer alterações de código.

Portanto, antes de testar vários outros valores, minha pergunta é qual é a diferença entre G e G17 em geral e quais problemas posso encontrar usando G em vez de G17?

(Sim, este valor precisa ser um float, não um decimal ou inteiro ou moeda, e o domínio do float pode variar por diferentes medidas/contextos).

O sistema precisa ser executado em 2012 e superior.

sql-server sql-server-2012
  • 1 respostas
  • 182 Views
Martin Hope
Cade Roux
Asked: 2019-09-14 15:02:32 +0800 CST

Usando XQuery para filtrar alguns filhos, mas preservando os pais

  • 9
SET NOCOUNT ON;
DECLARE @xml AS Xml = '<a><b>bbb</b><c>ccc</c><d>ddd</d></a>';
SELECT @xml;
SELECT @xml.query('/a/*[self::b or self::c]');
SET @xml.modify('delete /a/d');
SELECT @xml;

Fornece os seguintes conjuntos de resultados

Original:

<a><b>bbb</b><c>ccc</c><d>ddd</d></a>

Filtrado para excluir não--(b|c) - mas os pais estão ausentes:

<b>bbb</b><c>ccc</c>

O que eu quero (disponível com etapas de exclusão, mas não com .query):

<a><b>bbb</b><c>ccc</c></a>

É possível preservar os pais em um XQuery?

sql-server xquery
  • 1 respostas
  • 832 Views
Martin Hope
Cade Roux
Asked: 2018-11-02 14:10:57 +0800 CST

Gerando um gatilho genérico de INSERT/UPDATE para conformar dados?

  • 3

Estou tentando gerar gatilhos em várias tabelas para forçar os dados a maiúsculas e aparar espaços à esquerda e à direita quando os dados são inseridos ou atualizados. O problema que estou tendo é determinar na trigger uma forma geral de vincular a pseudotabela INSERTED à tabela base. Nem todas as tabelas têm o mesmo nome de PK, embora muitas tenham uma coluna exclusiva chamada _DataChanges_RowID em cada tabela que pode ser usada. Eu sei que posso inspecionar o PK e gerar os gatilhos usando essas colunas, mas antes de ver isso, queria saber se existe uma maneira genérica de unir a pseudotabela INSERTED à tabela base que é mais simples e independente de coluna.

DECLARE @TriggerTemplate AS VARCHAR(MAX) = 
'CREATE TRIGGER <<SchemaName>>.<<TriggerName>> ON <<FullTableName>>
AFTER INSERT, UPDATE
AS BEGIN
    IF (ROWCOUNT_BIG() = 0)
        RETURN;
    IF TRIGGER_NESTLEVEL(( SELECT object_id FROM sys.triggers WHERE QUOTENAME(name) = ''<<TriggerName>>'' ), ''AFTER'', ''DML'') < 1
    UPDATE <<FullTableName>>
    SET <<SQLColumnUpdate>>
    WHERE <<FullTableName>>._DataChanges_RowID IN (SELECT _DataChanges_RowID FROM INSERTED);
END;
GO
sp_settriggerorder <<SchemaName>>.<<TriggerName>>, ''FIRST'', ''INSERT'';
sp_settriggerorder <<SchemaName>>.<<TriggerName>>, ''FIRST'', ''UPDATE'';
GO
';

WITH cols AS 
    (
        SELECT
            FullTableName = QUOTENAME(S.name) + '.' + QUOTENAME(T.name),
            SchemaName = QUOTENAME(S.name),
            TableName = QUOTENAME(T.name),
            ColumnName = QUOTENAME(C.name)
        FROM
            sys.columns C
            INNER JOIN sys.tables T
                ON C.object_id = T.object_id
            INNER JOIN sys.schemas S
                ON T.schema_id = S.schema_id
        WHERE
            C.is_computed = 0
            AND C.system_type_id IN (
                    167,  -- varchar
                    175,  -- char
                    231,  -- nvarchar
                    239   -- nchar
                )
    )
, TablesAndColumns AS (
    SELECT
        cols.FullTableName
        , cols.TableName
        , cols.SchemaName
        , TriggerName = QUOTENAME('TRG_DATA_CONFORM_' + cols.FullTableName)
        , SQLColumnUpdate = STUFF((SELECT ', ' + c2.ColumnName + ' = UPPER(LTRIM(RTRIM(' + c2.ColumnName + ')))' 
               FROM cols c2
              WHERE c2.FullTableName = cols.FullTableName
              ORDER BY c2.ColumnName
                FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '')
    FROM cols
    GROUP BY cols.FullTableName, cols.SchemaName, cols.TableName
)
SELECT FullTableName
    , SQLTrigger = REPLACE(REPLACE(REPLACE(REPLACE(@TriggerTemplate, '<<SQLColumnUpdate>>', SQLColumnUpdate), '<<TriggerName>>', TriggerName), '<<FullTableName>>', FullTableName), '<<SchemaName>>', SchemaName)
    , KeyOK = CASE WHEN EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE QUOTENAME(TABLE_SCHEMA) = SchemaName AND QUOTENAME(TABLE_NAME) = TableName AND COLUMN_NAME = '_DataChanges_RowID') THEN 1 ELSE 0 END
FROM TablesAndColumns
;
sql-server trigger
  • 1 respostas
  • 402 Views
Martin Hope
Cade Roux
Asked: 2018-05-04 14:55:07 +0800 CST

Resolvendo a descoberta sp_Blitz: muitos planos para uma consulta

  • 4

insira a descrição da imagem aqui

Por que vários planos para uma consulta são ruins

Então eu estava correndo sp_Blitzpara controlar alguns sistemas. Tenho algum código para ser limpo como de costume. Alguns heaps que deveriam ser índices clusterizados. etc.

Essa consulta em particular estava usando literais, parecia resultar em muitos planos. Conseguiu a indexação e outras coisas classificadas nas tabelas nesta consulta e até mesmo parametrizou a consulta para o código/banco de dados mais recente para entrar em produção.

Mas ainda assim a consulta está aparecendo como um problema de parametrização. (O DBA transformou a consulta de cache do plano em um relatório do SSRS para que eu possa executá-los rapidamente no ambiente PROD do meu navegador).

Para onde ir a partir daqui? Ignore isto? (Parece que muitos planos contam)

Usar parametrização forçada? (Mas o que está explicitamente parametrizado está aparecendo).

Ugh - vejo que o desenvolvedor não seguiu meu conselho de que LEFT JOINestava sendo transformado em um INNER JOIN... vou ter que consertar isso ...

Sem parametrização forçada, todas essas consultas de estilo literal nunca compartilharão o mesmo plano? Esta consulta é muito complicada para parametrização simples ?

sql-server sql-server-2014
  • 1 respostas
  • 299 Views
Martin Hope
Cade Roux
Asked: 2013-05-31 11:31:59 +0800 CST

Oracle pivot em uma coluna com dados delimitados

  • 4

Meus dados são como:

keycol,col1,col2,col3
1,a;b;c,some data,some other data
2,x,some data,some other data
3,y;z,some data,some other data

Onde uma coluna é delimitada no sistema de origem com ponto e vírgula.

E eu quero girá-lo para:

1,a,some data,some other data
1,b,some data,some other data
1,c,some data,some other data
2,x,some data,some other data
3,y,some data,some other data
3,z,some data,some other data

Encontrei uma técnica aqui , mas não consigo fazê-la funcionar:

CREATE TABLE yt
    (keycol int, col1 varchar2(5), col2 varchar2(9), col3 varchar2(15))
;

INSERT ALL 
    INTO yt (keycol, col1, col2, col3)
         VALUES (1, 'a;b;c', 'some data', 'some other data')
SELECT * FROM dual
;

INSERT ALL 
    INTO yt (keycol, col1, col2, col3)
         VALUES (2, 'x', 'some data', 'some other data')
SELECT * FROM dual
;

INSERT ALL 
    INTO yt (keycol, col1, col2, col3)
         VALUES (3, 'y;z', 'some data', 'some other data')
SELECT * FROM dual
;

Achei que poderia incluir o keycol no CONNECT BY dessa forma para obter cadeias recursivas paralelas, mas acho que não funciona assim. Tenho certeza de que fiz isso com CTEs recursivas no SQL Server.

SELECT keycol
  ,trim(regexp_substr(col1, '[^;]+', 1, level)) col1
  ,col2 
  ,col3
FROM yt t
CONNECT BY keycol = PRIOR keycol AND instr(col1, ';', 1, level - 1) > 0

http://sqlfiddle.com/#!4/3d378

FWIW, estou no Oracle 10g.

oracle oracle-10g
  • 1 respostas
  • 970 Views
Martin Hope
Cade Roux
Asked: 2013-02-28 20:05:18 +0800 CST

Configurações do pacote SSIS 2008 sendo ignoradas

  • 10

Com a alteração nas configurações do pacote em 2008 em comparação com 2005, quando especifico /ConfigFile something.dtsConfig na linha de comando, as variáveis ​​definidas no pacote mantêm seus valores de tempo de design em vez de usar as configurações do arquivo de configuração.

Não tenho certeza se entendi COMO fazer com que o arquivo de configuração externo seja usado. Eu li artigos que dizem que apenas as configurações de tempo de design definidas substituirão o carregamento do arquivo externo. Isso significa que posso alterar as variáveis ​​para strings em branco e elas serão substituídas? Não consigo excluir a variável completamente! E os inteiros?

Já vi artigos que mencionam desligar usando configurações de pacote no arquivo package.

Posso usar o SSIS Package Editor ou um editor XML para alterar o caminho do arquivo de configuração no pacote e, em seguida, ele usará as configurações "últimas" desse arquivo (independentemente da opção externa /ConfigFile), mas não quero ser alterando o pacote. Eu quero um pacote com Test.dtsConfig e Production.dtsConfig e ser capaz de trocar sem alterar o pacote.

Qual é a maneira recomendada de fazer isso agora?

sql-server sql-server-2008
  • 1 respostas
  • 9383 Views
Martin Hope
Cade Roux
Asked: 2013-02-06 19:32:14 +0800 CST

SQL Server Deadlock em duas atualizações devido à ordem de bloqueio do índice

  • 11

Eu tenho dois UPDATEs - um bloqueia o CI primeiro e depois o NCI (no status) porque a coluna de status também está sendo atualizada. O outro já possui um bloqueio U no NCI porque sabe que está mudando e então tenta obter um bloqueio U no CI.

Qual é a maneira mais fácil de forçá-los a serializar? Parece estranho usar uma dica no nível TABLE, pois esse é um problema de indexação interna - há apenas uma tabela envolvida - UPDLOCK, HOLDLOCK se aplicará automaticamente apenas a todos os índices necessários nessa tabela e, assim, forçará sua serialização?

Aqui estão as consultas:

UPDATE htt_action_log
SET status = 'ABORTED', CLOSED = GETUTCDATE()
WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}'
AND status = 'OPEN';

Aquele X bloqueia a linha no CI (na coluna CREATED) e então tenta bloquear X no NCI que inclui a coluna de status.

UPDATE htt_action_log
SET status = 'RUNNING {36082BCD-EB52-4358-E3D3-4D96FD5B9F0F} 1360094342'
WHERE action_uuid = (SELECT TOP 1 action_uuid
                     FROM htt_action_log
                     WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}'
                         AND status = 'OPEN'
                     ORDER BY action_seq)

Este U bloqueia o mesmo NCI - para a consulta aninhada, eu acho, então bloqueia o CI para a atualização.

Assim, a ordem produz o impasse.

A solução mais fácil é forçar o bloqueio completo das duas consultas - ou seja, serializar. Qual é a maneira mais fácil de forçar isso, basta colocar WITH (UPDLOCK, HOLDLOCK)as referências à tabela (uma na primeira e duas na segunda)?

DDL:

Observe que o cliente tem mais índices nesta tabela que devem ser afetados por esta atualização, mas não são mencionados no gráfico de impasse.

CREATE TABLE [dbo].[HTT_ACTION_LOG](
    [ACTION_UUID] [varchar](128) NOT NULL,
    [TRANSITION_UUID] [varchar](128) NOT NULL,
    [STATUS] [varchar](128) NOT NULL,
    [CREATED] [datetime] NOT NULL,
    [CLOSED] [datetime] NULL,
    [ACTION_SEQ] [int] NOT NULL,
    [ACTION_TYPE] [varchar](15) NOT NULL,
    [ACTION_NAME] [varchar](50) NOT NULL,
    [ACTION_RESULT] [varchar](8000) NULL,
    [PENDING_SINCE] [datetime] NULL,
    [ACTION_SQL] [varchar](8000) NULL,
    [ERROR_OK] [int] NULL,
    [ERROR_COND] [varchar](2048) NULL,
    [RETRY] [varchar](128) NULL,
 CONSTRAINT [PK_HTT_ACTION_LOG_1] UNIQUE NONCLUSTERED 
(
    [ACTION_UUID] ASC
)
)

CREATE CLUSTERED INDEX [IK_HTT_ACTION_LOG_2] ON [dbo].[HTT_ACTION_LOG] 
(
    [CREATED] ASC
)

CREATE NONCLUSTERED INDEX [IK_HTT_ACTION_LOG_1] ON [dbo].[HTT_ACTION_LOG] 
(
    [TRANSITION_UUID] ASC,
    [STATUS] ASC
)
INCLUDE ( [ACTION_UUID],
[ACTION_SEQ])

CREATE NONCLUSTERED INDEX [IK_HTT_ACTION_LOG_4] ON [dbo].[HTT_ACTION_LOG] 
(
    [ACTION_UUID] ASC,
    [STATUS] ASC
)

CREATE NONCLUSTERED INDEX [missing_index_11438530_11438529_HTT_ACTION_LOG] ON [dbo].[HTT_ACTION_LOG] 
(
    [TRANSITION_UUID] ASC,
    [ACTION_TYPE] ASC
)
INCLUDE ( [ACTION_NAME])

CREATE NONCLUSTERED INDEX [missing_index_7207590_7207589_HTT_ACTION_LOG] ON [dbo].[HTT_ACTION_LOG] 
(
    [STATUS] ASC
)
INCLUDE ( [CREATED],
[PENDING_SINCE],
[ACTION_NAME])

CREATE NONCLUSTERED INDEX [missing_index_8535421_8535420_HTT_ACTION_LOG] ON [dbo].[HTT_ACTION_LOG] 
(
    [TRANSITION_UUID] ASC
)
INCLUDE ( [ACTION_UUID],
[STATUS])

ALTER TABLE [dbo].[HTT_ACTION_LOG] SET (LOCK_ESCALATION = AUTO)

ALTER TABLE [dbo].[HTT_ACTION_LOG]  WITH CHECK ADD  CONSTRAINT [FK_HTT_ACTION_LOG_1] FOREIGN KEY([TRANSITION_UUID])
REFERENCES [dbo].[HTT_TRANSITION_LOG] ([TRANSITION_UUID])

ALTER TABLE [dbo].[HTT_ACTION_LOG] CHECK CONSTRAINT [FK_HTT_ACTION_LOG_1]

ALTER TABLE [dbo].[HTT_ACTION_LOG] ADD  DEFAULT ('OPEN') FOR [STATUS]

ALTER TABLE [dbo].[HTT_ACTION_LOG] ADD  DEFAULT (getutcdate()) FOR [CREATED]

ALTER TABLE [dbo].[HTT_ACTION_LOG] ADD  DEFAULT ((0)) FOR [ERROR_OK]
sql-server deadlock
  • 1 respostas
  • 11439 Views
Martin Hope
Cade Roux
Asked: 2013-01-20 10:47:16 +0800 CST

Gráfico de deadlock com um bloqueio em um índice em uma tabela aparentemente não relacionada

  • 8

Eu tenho um gráfico de impasse de um impasse onde um processo está fazendo um SELECT e outro está fazendo um UPDATE. Este parece ser o caso clássico em que o SELECT obtém um bloqueio NCI para executar uma junção e, em seguida, um bloqueio CI para recuperar todos os dados por pesquisa. E o UPDATE está usando o bloqueio do CI para realizar uma atualização e então precisa bloquear um NCI porque a atualização resulta em uma mudança de status e o NCI facilita a localização de itens por status.

O problema é que um dos bloqueios que o UPDATE deseja NÃO está na tabela que está atualizando e não consigo descobrir porque isso está acontecendo.

Aqui está o SELECT:

SELECT *,
       RIGHT(c.CC_NUMBER, 4) AS CC_LAST_4,
       DATEDIFF(ss, '1970-01-01', plan_started ) plan_started_epoch,
       DATEDIFF(ss, '1970-01-01', plan_expires ) plan_expires_epoch
FROM customers c, accounts a, parent_cos pc, htt_customers_overlay_ultra u
WHERE c.customer_id = a.customer_id
AND   u.customer_id = c.customer_id
AND   a.cos_id=pc.cos_id
AND   u.customer_id = 9300;

Aqui está a ATUALIZAÇÃO:

UPDATE htt_customers_overlay_ultra SET plan_state = 'Active'  WHERE customer_id = 9300;

Mas de acordo com o gráfico de deadlock, o UPDATE está adquirindo um bloqueio em ACCOUNTS.ACCOUNT0, que é o PK (CI) da tabela ACCOUNTS. Não há chaves estrangeiras na tabela de sobreposição. Existem algumas restrições padrão que atualmente não tenho permissão para ver.

Eu olhei para o gráfico de impasse no SSMS e no SQL Sentry Plan Explorer Pro e não sou o mais sábio.

Seguem os planos de execução:

Para o SELECIONE

para a ATUALIZAÇÃO

Eu gostaria de descobrir porque está recebendo esse bloqueio e, em seguida, a melhor maneira de serializar essas chamadas.

Coisas que estou ciente das quais já aconselhei o cliente que têm relação com os bloqueios tomados, mas não explicam o aparente bloqueio não relacionado que está surgindo:

Remova * e identifique as colunas necessárias e altere os NCIs para se tornarem coberturas - isso potencialmente faria o SELECT usar menos bloqueios

Determine por que o sistema está SELECIONANDO os mesmos dados que outro processo está processando - isso potencialmente atenuaria esses dois processos em execução ao mesmo tempo.

Há uma varredura de tabela no SELECT

sql-server deadlock
  • 1 respostas
  • 1584 Views
Martin Hope
Cade Roux
Asked: 2012-08-10 14:05:10 +0800 CST

Opção para dizer ao Toad para nunca dividir um arquivo que contém vários objetos?

  • 7

Existe uma opção para dizer a ele para parar de me pedir para dividir um arquivo que contém vários objetos ao abrir arquivos .sql de uma janela de edição? Eu nunca quero dividir o arquivo!

oracle toad
  • 1 respostas
  • 2562 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