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

Rainbolt's questions

Martin Hope
Rainbolt
Asked: 2020-04-08 10:04:45 +0800 CST

Forçar instruções de atualização a obter bloqueios de página na mesma ordem?

  • 2

Eu tenho duas instruções de atualização na mesma tabela que recebem bloqueios de página em ordens diferentes. Isso leva a impasses.

  • O processo A possui um bloqueio de atualização na página 1 e solicita um bloqueio de atualização na página 2.
  • O processo B possui um bloqueio de atualização na página 2 e deseja um bloqueio de atualização na página 1.

Como posso forçar ambas as instruções a fazerem bloqueios de página na mesma ordem?

sql-server sql-server-2014
  • 2 respostas
  • 43 Views
Martin Hope
Rainbolt
Asked: 2018-05-16 13:45:56 +0800 CST

Por que o SQL Server usa um plano de execução melhor quando inline a variável?

  • 33

Eu tenho uma consulta SQL que estou tentando otimizar:

DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962'

SELECT 
  Id,
  MIN(SomeTimestamp),
  MAX(SomeInt)
FROM dbo.MyTable
WHERE Id = @Id
  AND SomeBit = 1
GROUP BY Id

MyTabletem dois índices:

CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes
ON dbo.MyTable (SomeTimestamp ASC)
INCLUDE(Id, SomeInt)

CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes
ON dbo.MyTable (Id, SomeBit)
INCLUDE (TotallyUnrelatedTimestamp)

Quando executo a consulta exatamente como escrito acima, o SQL Server verifica o primeiro índice, resultando em 189.703 leituras lógicas e uma duração de 2 a 3 segundos.

Quando inline a @Idvariável e executo a consulta novamente, o SQL Server busca o segundo índice, resultando em apenas 104 leituras lógicas e uma duração de 0,001 segundo (basicamente instantânea).

Eu preciso da variável, mas quero que o SQL use o bom plano. Como solução temporária, coloco uma dica de índice na consulta, e a consulta é basicamente instantânea. No entanto, tento ficar longe de dicas de índice quando possível. Normalmente, presumo que, se o otimizador de consulta não puder fazer seu trabalho, há algo que posso fazer (ou parar de fazer) para ajudá-lo sem dizer explicitamente o que fazer.

Então, por que o SQL Server apresenta um plano melhor quando inline a variável?

sql-server performance
  • 3 respostas
  • 6800 Views
Martin Hope
Rainbolt
Asked: 2018-03-07 10:55:51 +0800 CST

Como inicializo a replicação transacional de um backup em uma URL?

  • 1

Criei uma publicação no meu servidor. Eu tive que usar essa opção especial para poder inicializar a replicação de um backup:

exec sp_addpublication 
    ...
    @allow_initialize_from_backup = N'true', 
    ...

Então, fiz um backup do meu banco de dados:

BACKUP DATABASE [MyDatabase] 
    TO URL = 'https://fakestorageaccount.blob.core.windows.net/mycontainer/MyDatabase.bak' 
    WITH CREDENTIAL = 'mycredential', COMPRESSION, STATS = 5;
GO

E restaurado a partir dele no servidor de destino:

RESTORE DATABASE [MyDatabase] 
  FROM URL = 'https://fakestorageaccount.blob.core.windows.net/mycontainer/MyDatabase.bak'
  WITH CREDENTIAL = 'mycredential'
    ,MOVE 'MyDatabase' to 'SomePath\Data\MyDatabase.mdf'
    ,MOVE 'MyDatabase_log' to 'SomePath\Log\MyDatabase.ldf'
    ,STATS = 5 
GO

Agora estou pronto para criar o assinante. O problema que estou tendo é que não sei quais opções fornecer ao procedimento sp_addsubscription .

Eu posso passar pelo processo usando um disco rígido comum em vez de um URL. Eu podia ver os dados sendo replicados da origem para o destino. Faço backup em disco, copio o backup para o servidor de destino, restauro e inicializo a partir do backup usando este comando:

exec sp_addsubscription 
    @publication = N'MyPub', 
    @subscriber = N'MyTargetServer', 
    @destination_db = N'MyDatabase', 
    @subscription_type = N'Push', 
    @sync_type = N'initialize with backup', 
    @article = N'all', 
    @update_mode = N'read only', 
    @subscriber_type = 0,
    @backupdevicetype = 'disk',
    @backupdevicename = 'D:\Backups\MyDatabase.bak'

Como faço para ajustar essas opções para inicializar a replicação de uma URL (que no meu caso é um contêiner de armazenamento de BLOBs do Azure para o qual ambos os servidores têm as credenciais)?

replication azure-blob-storage
  • 1 respostas
  • 197 Views
Martin Hope
Rainbolt
Asked: 2018-02-13 07:37:22 +0800 CST

Por que meu arquivo de log de transações está crescendo tanto depois de desabilitar a replicação?

  • 0

Em Por que o log de transações continua crescendo ou fica sem espaço? , dois motivos comuns são descritos para o crescimento de um log de transações:

  1. O banco de dados está no modo de recuperação total e os backups de log não estão sendo feitos.
  2. Uma transação de longa duração está ocupando muito espaço.

Tanto quanto eu posso dizer, nenhuma dessas razões se aplica a mim. Meu banco de dados está no modo de recuperação simples e não há transações demoradas ocupando muito espaço.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Observe que tive sorte quando tirei a captura de tela DBCC OPENTRANe não havia transações ativas. Na maioria das vezes eu vejo e vejo uma transação que começou segundos atrás.

Outra resposta sugere que meu log pode ser grande, mas vazio. Para verificar isso, cliquei com o botão direito do mouse no banco de dados e naveguei até Tarefas -> Encolher -> Arquivos e selecionei o tipo de arquivo de log. Eu posso ver que meu arquivo de log é grande e também tem muito pouco espaço livre.

insira a descrição da imagem aqui

Usei a consulta de Aaron Bertrand para descobrir quais sessões estão causando o crescimento do arquivo de log e em qual intervalo. A consulta me diz que o arquivo de log cresce em um intervalo semi-regular, cerca de uma vez a cada 10 minutos. O SPID é sempre diferente e nem sempre vem da mesma aplicação. Eu usei uma consulta (que não consigo encontrar agora por algum motivo) para descobrir qual instrução SQL essa sessão estava executando pela última vez. Estudei essas consultas para ver se alguma coisa se destacou e não vi nada óbvio. Por fim, decidi que, se DBCC OPENTRANdisse que nenhuma transação estava sendo executada por muito tempo, o problema não deveria estar nas consultas que estão sendo executadas pelos aplicativos.

Recentemente, tentamos configurar a replicação transacional com esse banco de dados como origem. Acabamos tendo que abandonar, mas tivemos problemas para remover a publicação. Tivemos que descartar manualmente o banco de dados de distribuição e usar sp_removedbreplicationpara limpar. Eu li que a replicação pode fazer com que o log de transações cresça desmarcado . Meus pensamentos são que, como a exclusão da publicação não foi tão tranquila, talvez o arquivo de log esteja crescendo porque algum resquício da replicação ficou por perto.

Então, além dos dois motivos mais comuns, o que mais posso fazer para descobrir por que o log de transações está crescendo tanto (e corrigi-lo)?

sql-server transaction-log
  • 1 respostas
  • 4223 Views
Martin Hope
Rainbolt
Asked: 2017-12-03 21:16:29 +0800 CST

É possível desabilitar bloqueios para uma tabela específica?

  • -2

É possível desabilitar todos os bloqueios de uma tabela específica em qualquer versão do SQL Server?

Eu tenho um punhado de tabelas que são preenchidas com dados no momento da implantação. Por exemplo, uma das tabelas menores, [items].[Colour], contém 'Blue', 'Green', 'Red', 'White'. Após a implantação, o(s) aplicativo(s) sempre seleciona(m) dessas tabelas (nunca insere, atualiza ou exclui). Eu comecei a pensar, se essas tabelas são apenas lidas, então qual é o sentido de ter bloqueios? Suponho que demore algum tempo para obter um bloqueio. Mesmo que essa quantidade de tempo seja insignificante, parte de mim não ficará satisfeita até que eu mesmo teste a diferença.

Enquanto procurava a resposta por conta própria, descobri que posso marcar um banco de dados inteiro como somente leitura e que pode haver alguns benefícios . Eu quero esses benefícios, mas numa base de tabela por tabela. Eu também li sobre desabilitar o escalonamento de bloqueio, mas se eu entendi a documentação corretamente, isso só levaria a mais bloqueios (embora mais refinados), que é o oposto do que eu quero alcançar.

Eu sei que posso atualizar cada consulta que usa a tabela para ter uma NOLOCKdica, mas isso apresenta um problema secundário. No futuro, quando eu ensinar meu aplicativo a aprender novos Colours em tempo de execução, quero atualizar todas as consultas que usam a tabela para remover a NOLOCKdica? Isso soa como um incômodo.


Parece que a pergunta está recebendo alguns votos negativos e, sem nenhuma explicação fornecida, vou assumir que é porque isso parece que o que estou pedindo é otimização prematura. A otimização prematura é, como apontado em um comentário agora excluído, a raiz de todo mal. Eu sei disso e não estou otimizando prematuramente. Aqui está o porquê.

Tenho permissão para pesquisar essa API uma vez por segundo. Não está declarado na página vinculada, mas vi a regra em algum lugar (confie em mim). De qualquer forma, meu aplicativo leva de 100ms a 800ms para fazer a solicitação HTTP, baixar o arquivo de texto gzip'd e descompactá-lo. A maior parte desse tempo é gasto aguardando a resposta da API. Isso me deixa quase sem tempo para processar todos os dados em tabelas de banco de dados bonitas, organizadas e normalizadas. Para ser competitivo, tenho que processar todos os dados em 200 ms ou menos. Estou tão perto de atingir meu objetivo que estou cortando custos descartando dados que talvez não precise, enviando todos os dados para o banco de dados de uma só vez em um grande e feio pacote etc. Então, sim, estou otimizando, mas não prematuramente (na minha opinião).

Também reconheço que o que estou pedindo pode não trazer benefícios de desempenho. Na verdade, a única solução que foi fornecida até agora não pareceu afetar o desempenho em nada. Eu não poderia saber disso antes de fazer a pergunta, e agora quaisquer futuros visitantes que estejam se perguntando se isso os ajudará podem ver o teste que realizei e saber que não vale a pena. Isso não é útil?

Se isso não resolver as preocupações dos downvoters, por favor, considere deixar um comentário com o que você acha que eu poderia melhorar sobre a pergunta.

sql-server locking
  • 1 respostas
  • 727 Views
Martin Hope
Rainbolt
Asked: 2017-05-10 13:39:05 +0800 CST

Onde posso encontrar uma lista de logins reservados?

  • 3

Eu tenho uma página da web onde o usuário pode configurar um login e senha do SQL Server. Estou tentando implementar a validação para esta página.

Pesquisei os requisitos para um logon do SQL Server e encontrei este artigo da Microsoft . De acordo com esse artigo, os logons do SQL Server não podem ser um nome de logon reservado. "sa" e "public" são fornecidos como exemplos. Uma lista completa de nomes de login reservados não é fornecida e não consegui encontrar uma pesquisando.

Existe uma lista de nomes de logon do SQL Server reservados? Se sim, onde posso encontrar?

sql-server logins
  • 1 respostas
  • 181 Views
Martin Hope
Rainbolt
Asked: 2016-06-28 11:33:48 +0800 CST

Por que os padrões de coluna em meu tipo de tabela definida pelo usuário (UDTT) não estão sendo respeitados?

  • 3

Eu crio um tipo de tabela em SQL:

CREATE TYPE [dbo].[MyObject_TableType] AS TABLE
(
    [Name] VARCHAR(MAX) DEFAULT '',
    [Index] VARCHAR(MAX) DEFAULT ''
)

Eu construo um DataTablee o preencho com um DataRow. Eu forneço essa tabela como um parâmetro para um procedimento armazenado:

// Set up connection and command variables (code omitted)
// ...

// Make the data table
var table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Index");

// Add one row that is missing an Index    
var row = table.NewRow();
row["Name"] = "ObjectOne";
table.Rows.Add(row);

// Make a parameter for the table
var tableParameter = new SqlParameter("MyObjects", SqlDbType.Structured)
{
    TypeName = "MyObject_TableType",
    Value = table
};

command.Parameters.Add(tableParameter);
command.ExecuteNonQuery();

Eu esperava que dentro do procedimento armazenado, o valor do índice fosse padronizado para ''(vazio VARCHAR). Em vez disso, observei que o valor era nulo. Sei disso porque tentei mesclar o tipo de tabela em uma tabela real e a coluna de índice em minha tabela não permite nulos.

Por que o SQL Server não honra o padrão que coloquei no meu tipo de tabela? Existe uma maneira de forçar o SQL Server a honrá-lo?

Acho que posso contornar o problema usando a propriedade DataTable.DefaultValue , mas essa solução tem a desvantagem de precisar declarar os mesmos padrões em dois lugares diferentes. Eu quero evitar código redundante, se possível.

sql-server c# default-value
  • 1 respostas
  • 2787 Views
Martin Hope
Rainbolt
Asked: 2016-02-04 09:28:02 +0800 CST

Como posso selecionar todos os pais das linhas que existem em outra tabela?

  • 4

Eu tenho duas tabelas que compartilham um relacionamento muitos para muitos. Os relacionamentos são armazenados em uma terceira tabela.

CREATE TABLE Person
(
    Id int NOT NULL,
    Name varchar(255) NOT NULL,
    PRIMARY KEY (Id)
)

CREATE TABLE Filenodes
(
    Id hierarchyid NOT NULL,
    Name varchar(255) NOT NULL,
    PRIMARY KEY (Id)
)

CREATE TABLE PersonFilenodes
(
    FileId hierarchyid NOT NULL,
    PersonId int NOT NULL,
    PRIMARY KEY (FileId, PersonId)
)

Preciso selecionar todos os nós de arquivo que pertencem a uma pessoa, bem como todos os arquivos que são ancestrais desses arquivos.

Eu sei selecionar todos os Filenodesque pertencem a uma determinada pessoa:

SELECT Id, Name
FROM PersonFilenodes
JOIN Filenodes on Filenodes.Id = PersonFilenodes.FileId
WHERE Id = @personId

Graças a marc_s , também sei como selecionar todos os ancestrais de um determinado filenode :

SELECT Id, Name
FROM Filenodes
WHERE @filenodeId.IsDescendantOf(Id) = 1

Simplesmente não consigo descobrir como combinar as duas consultas para obter o conjunto de resultados de que preciso. Como posso selecionar todos os nós de arquivo que pertencem a uma pessoa, bem como todos os arquivos que são ancestrais desses arquivos?

sql-server
  • 1 respostas
  • 106 Views
Martin Hope
Rainbolt
Asked: 2015-10-01 07:38:21 +0800 CST

Como posso evitar a repetição da mesma condição em uma cláusula "quando correspondido, então atualize"?

  • 5

Eu quero mesclar uma tabela em outra. Preciso aplicar a lógica condicional na minha cláusula WHEN MATCHED, que idealmente seria feita assim:

MERGE INTO ATable AS a
USING BTable AS b
ON a.ID = b.ID
WHEN NOT MATCHED THEN
-- Do insert
WHEN MATCHED AND b.NeedsAdjustment = 1 THEN
UPDATE SET
    Col1 = b.Col1 + b.Adjustment
    ,Col2 = b.Col2 + b.Adjustment
    ,Col3 = b.Col3 + b.Adjustment
WHEN MATCHED THEN -- Default case (b.NeedsAdjustment <> 1)
UPDATE SET
    Col1 = b.Col1
    ,Col2 = b.Col2
    ,Col3 = b.Col3

Este não é um SQL válido. De acordo com a documentação do MSDN:

Se houver duas cláusulas WHEN MATCHED, uma deverá especificar uma ação UPDATE e a outra deverá especificar uma ação DELETE.

Isso me leva à seguinte consulta:

MERGE INTO ATable AS a
USING BTable AS b
ON a.ID = b.ID
WHEN NOT MATCHED THEN
-- Insert happens here
WHEN MATCHED THEN
UPDATE SET
    Col1 = CASE WHEN b.NeedsAdjustment = 1 THEN b.Col1 ELSE b.Col1 + b.Adjustment END
    ,Col2 = CASE WHEN b.NeedsAdjustment = 1 THEN b.Col2 ELSE b.Col2 + b.Adjustment END
    ,Col3 = CASE WHEN b.NeedsAdjustment = 1 THEN b.Col3 ELSE b.Col3 + b.Adjustment END

A lógica condicional é movida dentro da atualização para contornar o fato de que as mesclagens podem ter apenas uma WHEN MATCHED THEN UPDATEcláusula. Agora, em vez de uma verificação por linha, tenho uma verificação por linha por coluna (e há muito mais colunas do que as três do exemplo).

Posso evitar repetir essa condição para cada coluna que precisa ser atualizada? Existe uma maneira melhor de fazer atualizações condicionais que talvez não envolvam mesclagens?

sql-server update
  • 4 respostas
  • 1991 Views
Martin Hope
Rainbolt
Asked: 2015-04-07 09:49:04 +0800 CST

Abreviação de chave primária?

  • 2

Existe um atalho para mesclar linhas com base na chave primária? Por exemplo:

MERGE INTO [MyDatabase].[MySchema].[MyTable] AS target
USING [MyLinkedServer].[MyDatabase].[MySchema].[MyTable] AS source
   -- The following line is pseudocode illustrating what we want to accomplish
   ON (target primary key equals source primary key)
WHEN MATCHED THEN
    UPDATE SET target.MyColumn = source.MyColumn
WHEN NOT MATCHED BY TARGET THEN
    INSERT (MyCol1, MyCol2, MyCol3)
    VALUES (source.MyCol1, source.MyCol2, source.MyCol3);

Escrever as condições é tedioso se a chave primária contiver um grande número de colunas. Além disso, se a chave primária for alterada, muitas junções e fusões podem ser interrompidas repentinamente.

Você pode perguntar: "Por que a chave primária está mudando?" Cenário real: Fomos informados de que um objeto foi identificado exclusivamente por seu nome distinto. Mais tarde, descobrimos que um nome distinto poderia mudar se o objeto fosse movido para outra sub-rede. Novos requisitos que mudaram a maneira como identificamos os objetos de maneira exclusiva. Isso quebrou o produto em vários lugares. Parte da confusão poderia ter sido evitada se tivéssemos mesclado na chave primária em vez de em colunas específicas.

sql-server t-sql
  • 1 respostas
  • 260 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