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

James Anderson's questions

Martin Hope
James Anderson
Asked: 2015-11-07 06:24:06 +0800 CST

A validação do guia de plano com fn_validate_plan_guide fornece falsos positivos

  • 3

Ao validar um guia de plano para uma parte do SQL em um procedimento armazenado que faz referência a uma tabela temporária chamada "#test", a função fn_validate_plan_guide retorna o erro: Nome de objeto inválido '#teste'.

Mas o guia de plano ainda envia a dica de consulta para o SQL e a execução desejada é alcançada.

Isso destaca um problema com a função fn_validate_plan_guide?

O script abaixo recria o problema.

--Enable the actual execution plan before running the query so the plans can be compared

USE [msdb]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    CREATE TABLE #test 
    (
        ID INT
    )

    INSERT INTO #test
    SELECT ROW_NUMBER() OVER(ORDER BY job_id) 
    FROM dbo.sysjobs

    SELECT * 
    FROM #test t
    JOIN #test t2 ON t.ID = t2.ID

    DROP TABLE #Test 
END
GO

--Execution before the plan guide is created will have a hash join in the second batch
EXEC msdb.dbo.test
GO

--Create the plan guide
EXEC sp_create_plan_guide 'test',
'   SELECT * 
    FROM #test t
    JOIN #test t2 ON t.ID = t2.ID', 
'OBJECT', 'dbo.test', NULL, 'OPTION (MERGE JOIN)'
GO

--Validate the plan guide. This returns the error "Invalid object name '#test'."
SELECT 
    plan_guide_id, msgnum, severity, state, message, 
    name, create_date, is_disabled, query_text, scope_type_desc, scope_batch, parameters, hints
FROM sys.plan_guides
CROSS APPLY fn_validate_plan_guide(plan_guide_id);
GO

--Execution after the plan guide is created will have a merge join in the second batch
EXEC msdb.dbo.test
GO

EXEC sp_control_plan_guide 'DISABLE', 'test'
GO

--Execution after the plan guide is disabled will go back to having a hash join in the second batch
EXEC msdb.dbo.test
GO

EXEC sp_control_plan_guide 'ENABLE', 'test'
GO

--Execution after the plan guide is re-enabled will go back to having a merge join in the second batch
EXEC msdb.dbo.test
GO

--Clean up
EXEC sp_control_plan_guide 'DROP', 'test'
GO

DROP PROCEDURE test
GO

Esta função está dando erros que são falsos positivos ou são apenas avisos de que o guia do plano pode falhar ou é outra coisa que não pensei?

Criei um item Connect aqui com o texto acima, mas ainda não recebi uma resposta.

sql-server sql-server-2012
  • 1 respostas
  • 296 Views
Martin Hope
James Anderson
Asked: 2015-10-02 04:17:40 +0800 CST

Reconstrução de índice clusterizado online usando mais espaço de log do que o esperado

  • 5

eu tenho uma mesaTableA

ID PK BIGINT
TrxID BIGINT
CardBalance INT
AccountBalance INT

SP_SPACEUSED 'TableA'resultado:

name    rows       reserved     data         index_size   unused
TableA  904054184  55547120 KB  34661408 KB  19963544 KB  922168 KB

Portanto, o tamanho dos dados é de cerca de 33 GB. Há um índice clusterizado no TrxID. Há um índice não clusterizado, que chega a cerca de 19 GB.

O tamanho do meu arquivo de log de transações é de cerca de 250 GB. DBCC SQLPERF('logspace')mostra < 1% de uso.

Quando eu corro:

ALTER INDEX CIX_TableA_TrxID ON dbo.TableA REBUILD WITH (ONLINE = ON)

O log de transações atinge 100% após cerca de 20 minutos e continua a crescer.

Existe uma maneira confiável de calcular quanto espaço de log é necessário para esta operação?

Além disso, parece muito espaço para usar no arquivo de log, parece certo?

  • Este banco de dados está em um Grupo de Disponibilidade (portanto, usando o modelo de recuperação completa) com 1 outra réplica assíncrona.
  • Este é um banco de dados de teste, portanto, não há nenhuma outra transação em execução ao mesmo tempo que a reindexação.
sql-server sql-server-2012
  • 1 respostas
  • 333 Views
Martin Hope
James Anderson
Asked: 2015-01-16 03:19:24 +0800 CST

Seria melhor que os planos de consulta fossem divididos por instrução para reutilização?

  • 11

Do meu conhecimento limitado de como os planos de consulta são compilados, armazenados e recuperados por consultas, entendo que uma consulta com várias instruções ou um procedimento armazenado gerará seu plano de consulta, que será armazenado no cache do plano de consulta para ser usado pela consulta em execuções futuras.

Acho que esse plano é recuperado do cache do plano de consulta com o hash da consulta, o que significa que, se a consulta for editada e executada, o hash é diferente e um novo plano é gerado, pois nenhum hash correspondente pode ser encontrado no cache do plano de consulta.

Minha pergunta é: se um usuário executa uma instrução que é uma das instruções na consulta de várias instruções, ele pode usar essa parte relevante do plano de consulta já no cache para a consulta de várias instruções? Espero que a resposta seja não porque os valores de hash obviamente não corresponderão, mas seria melhor fazer o hash de cada instrução em uma consulta de várias instruções para que pudessem ser usadas por usuários executando instruções individuais da consulta?

Espero que haja complicações que não estou levando em consideração (e são essas que eu realmente quero saber), mas parece que poderíamos estar armazenando o mesmo 'plano de instrução' em muitos planos de consulta, ocupando mais espaço e ocupando mais CPU e tempo para gerar.

Poderia estar apenas mostrando minha ignorância embora.

sql-server execution-plan
  • 1 respostas
  • 372 Views
Martin Hope
James Anderson
Asked: 2014-12-31 06:21:48 +0800 CST

Escravo de replicação MySQL do escravo não recebendo atualizações

  • 2

Tenho 4 servidores: A, B, C e D.

A e B estão em uma configuração mestre-mestre.

C é escravo de B e D é escravo de C.

Alterações em A ou B atingem todos os nós exceto D. Eu preciso que elas cheguem a D

Alterações em C chegam a D, mas obviamente não vão para A ou B, o que é bom.

Depois de algumas leituras, descobri que precisava da opção log-slave-updates definida em C, desta forma C registraria as alterações replicadas para ele e então D poderia lê-las e fazer as mesmas atualizações.

Eu defini a opção como ativada e D está esperando que seu mestre envie eventos, mas as alterações de A ou B ainda não estão chegando a D.

mysql replication
  • 1 respostas
  • 985 Views
Martin Hope
James Anderson
Asked: 2014-10-30 09:30:33 +0800 CST

Filtrar tabela antes de ingressar

  • 6

Eu tenho um procedimento armazenado que preenche a tabela temporária #employee_benefits com uma lista de IDs. Essa tabela acaba tendo aproximadamente 10.000 linhas. A consulta abaixo seleciona de uma tabela chamada EmployeeBenefitData que tem cerca de 4 milhões de linhas.

SELECT  ebd.EmployeeBenefitDataId, ebd.EmployeeBenefitId, ebd.[DataDefinitionId]
FROM    #employee_benefits eb
INNER JOIN EmployeeBenefitData ebd ON eb.EmployeeBenefitId = ebd.EmployeeBenefitId

O gargalo era a varredura de índice na tabela EmployeeBenefitData. Ele fez a varredura de índice primeiro e depois a juntou à tabela temporária. A tabela temporária estava agindo como um filtro, o que significa que a varredura de todos os dados antes da junção era muito ineficiente. Adicionei o código a seguir para alterar a varredura para uma busca e reduzir drasticamente a quantidade de leituras necessárias.

DECLARE @MinEmpBenId INT, @MaxEmpBenId INT

SELECT @MinEmpBenId = MIN(EmployeeBenefitId), @MaxEmpBenId = MAX(EmployeeBenefitId)
FROM #employee_benefits

SELECT  ebd.EmployeeBenefitDataId, ebd.EmployeeBenefitId, ebd.[DataDefinitionId],
        dd.TypeId, dd.DataDefinitionId, dd.Name, ebd.[Value], ebd.[Date], ebd.[Text]
FROM    #employee_benefits eb
INNER JOIN EmployeeBenefitData ebd ON eb.EmployeeBenefitId = ebd.EmployeeBenefitId
INNER JOIN DataDefinition dd ON ebd.DataDefinitionId = dd.DataDefinitionId
WHERE   ebd.EmployeeBenefitId >= @MinEmpBenId AND ebd.EmployeeBenefitId <= @MaxEmpBenId

Faz uma enorme diferença nas estatísticas do cliente

Tempo total de execução 74, 1794
Tempo de espera nas respostas do servidor 11, 11

Minha pergunta é: isso é uma boa prática? E por que o otimizador não faz isso?

ATUALIZAÇÃO Eu deveria ter mencionado que a tabela temporária tem um índice clusterizado em EmployeeBenefitID

sql-server sql-server-2012
  • 2 respostas
  • 4112 Views
Martin Hope
James Anderson
Asked: 2014-06-14 01:53:15 +0800 CST

SQL Server 2012 SSD local TempDB lento

  • 5

Eu tenho uma implantação de produção usando SSDs locais para tempDB. Eu tenho 2 SSDs em uma configuração RAID1. Estou vendo leituras médias de 1-2ms, mas as gravações médias estão aparecendo como 1377ms em todos os meus quatro arquivos de dados tempdb.

Cada arquivo de dados tempdb tem 2 GB com uma configuração de crescimento de 1 GB (eles não cresceram desde a implantação há 5 meses)

O log do tempdb mostra leitura média de 67 ms e gravação média de 215 ms.

Os SSDs são profissionais Samsung 840.

O código a seguir é o que eu uso para obter minhas estatísticas

SELECT a.database_Id, 
a.file_id, 
db_name(a.database_id) AS dbname, 
b.name, 
db_file_type =  CASE 
                WHEN a.file_id = 2 THEN 'Log' 
                ELSE 'Data' 
                END, 
UPPER(SUBSTRING(b.physical_name, 1, 2)) AS disk_location, 
a.io_stall, 
a.io_stall_read_ms / Case When a.num_of_reads = 0 Then 1 Else a.num_of_reads end AvgRead,  
a.io_stall_write_ms / Case When a.num_of_writes = 0 Then 1 Else a.num_of_writes end AvgWrite,  
Cast(Round(((( a.size_on_disk_bytes / 1024 ) / 1024.0 ) / 1024), 2) as float) AS size_on_disk_gb                    

FROM sys.dm_io_virtual_file_stats (NULL, NULL) a 
JOIN sys.master_files b ON a.file_id = b.file_id AND a.database_id = b.database_id 

ORDER BY a.io_stall DESC

Abaixo estão as 5 primeiras linhas retornadas

database_Id file_id dbname  name    db_file_type    disk_location   io_stall    AvgRead AvgWrite    size_on_disk_gb
2   1   tempdb  tempdev Data    F:  19782846713 2   1377    2
2   3   tempdb  tempdev2    Data    F:  19782655021 2   1377    2
2   5   tempdb  tempdev4    Data    F:  19782364070 2   1377    2
2   4   tempdb  tempdev3    Data    F:  19782151571 2   1377    2
2   2   tempdb  templog Log F:  378829065   67  215 1

Portanto, meus arquivos tmepdb em SSDs são as unidades mais lentas que tenho. Algo que eu deveria estar olhando do ponto de vista da configuração/infraestrutura? No momento, estou estudando o uso de aplicativos de tempdb e qualquer vazamento de memória, mas não estou vendo nada terrível.

performance sql-server-2012
  • 1 respostas
  • 1493 Views
Martin Hope
James Anderson
Asked: 2014-05-02 06:48:17 +0800 CST

Restringir os usuários a COPIAR APENAS os backups

  • 14

Estou procurando implantar o envio de logs em meu ambiente de produção. Isso significa que terei que gerenciar cadeias de backup que podem ser interrompidas por pessoas que fazem backups para atualizar os ambientes de desenvolvimento. Se eu tiver uma falha e quiser usar os backups de log para restaurar em um ponto no tempo, também precisarei do backup feito pelo desenvolvedor.

Isso não aconteceria se os desenvolvedores usassem apenas backups COPY ONLY. Então, minha pergunta é: Existe uma maneira de restringir os usuários para apenas executar backups COPY ONLY?

sql-server backup
  • 3 respostas
  • 1653 Views
Martin Hope
James Anderson
Asked: 2014-01-22 05:13:13 +0800 CST

1 redução do banco de dados abusado ou restauração do backup [duplicado]

  • 1
Esta pergunta já tem respostas aqui :
Preciso reduzir meu banco de dados - acabei de liberar muito espaço (4 respostas)
Fechado há 8 anos .

Eu tenho um banco de dados que herdei que foi deixado por muito tempo para crescer e crescer. 95% desse crescimento é causado por 1 tabela de log usada por nosso aplicativo. O banco de dados tem 120 GB e está em modo de recuperação total. Os backups compactados têm cerca de 10 GB. O servidor é de 2008. O arquivo de log é de 3,5 GB

Depois de perguntar, descobri que posso remover todos os dados desta tabela de log com mais de 3 meses. Isso me dá 100 GB de espaço livre. Também escrevi um trabalho de agente para manter a tabela de log nesse nível.

Isso significa que terei aproximadamente 100 GB sentados neste arquivo para sempre (desde que nenhuma outra tabela comece a crescer da maneira que não acontecia anteriormente ou o trabalho do agente falhe)

Eu gostaria de liberar um pouco desse espaço, deixando espaço suficiente para o crescimento futuro, que deve ser muito menor do que era antes de meu trabalho de agente ser contratado.

Portanto, não quero reduzir e desfragmentar os índices, pois isso pode exigir muito tempo de inatividade e quase sempre é uma má ideia.

Eliminar o banco de dados e restaurar o backup de 10 GB é uma opção? Eu nem tenho certeza se isso vai me dar o resultado desejado, que é um banco de dados menor com algo como 2 GB livres em seu arquivo para crescimento futuro.

Obrigado

sql-server-2008 restore
  • 1 respostas
  • 97 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