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[database-internals](dba)

Martin Hope
Joe
Asked: 2022-04-26 01:55:56 +0800 CST

Altere a definição de um índice com expressão sem descartar/recriar o índice

  • 3

Estou em uma situação peculiar:

Eu tenho vários índices com expressões que usam uma função. Quero trocá-los para uma função diferente, onde posso garantir que a função se comporte da mesma forma (para que os valores indexados não sejam inválidos). Idealmente, não quero descartar o índice existente e reindexá-lo, porque isso requer mais sobrecarga de desenvolvimento.

Eu posso ver na pg_indextabela, há uma indexprscoluna, que contém a definição "interna" de um índice (a pg_indexestabela é uma versão muito impressa disso). Especificamente, acho que identifiquei os índices relevantes para ter um formato nos moldes de ({FUNCEXPR :funcid 870 :funcresulttype 25 :funcretset false...

Voltando funcid 870para o information_schema.routines, consegui correlacioná-lo no specific_name(que contém esse funcid) e pude determinar que é de fato a função específica que quero alterar.

Seria - teoricamente - possível substituir esse funcid pelo novo funcid e os índices então se refeririam à nova função? Como eu faria isso, já que esta coluna é do tipo pg_node_tree? Se não, existe uma maneira de atingir meu objetivo de uma maneira não hackeada?

Adendo: Provavelmente ainda farei isso da maneira "limpa", a menos que haja uma maneira segura e comprovada de fazer isso, mas isso despertou meu interesse o suficiente para fazer uma pergunta sobre isso.

postgresql database-internals
  • 1 respostas
  • 78 Views
Martin Hope
xhr489
Asked: 2021-10-04 13:25:23 +0800 CST

Leitura de tipos de dados de comprimento fixo

  • 0

Digamos que eu tenha uma coluna de tamanho fixo e estou SELECTpartindo dela, digamos 100 linhas. Ao ler diferentes linhas da coluna de comprimento fixo, o SQL Server verifica o comprimento da coluna para cada linha ou verifica uma vez e reutiliza essas informações para que as linhas subsequentes possam ser lidas mais rapidamente?

Por outro lado, para colunas de comprimento variável, o SQL Server precisa verificar o comprimento de cada coluna de comprimento variável para cada linha, usando a matriz de deslocamento.

Portanto, minha pergunta é: o SQL Server verifica o comprimento dos tipos de dados de comprimento fixo para cada linha (ou seja, após os bits de status A e B da linha)? Logicamente, quando ele precisa ler uma coluna de comprimento fixo, ele só precisa verificá-lo uma vez.

Essa sobrecarga é a razão pela qual os índices são melhores em colunas de comprimento fixo?

Não tentando resolver nenhum problema, apenas tentando entender.

Informações extras: em relação a que os índices são melhores em colunas de comprimento fixo: Toda essa questão começou para mim quando eu estava lendo este artigo Estratégias de indexação para desempenho do SQL Server . Em um ponto, ele diz: "Uma chave de índice clusterizado deve ser estreita, mas também usar um tipo de dados de largura fixa". Quais são as razões para esta afirmação? Só consigo pensar no motivo relacionado à minha pergunta, ou seja, colunas de comprimento fixo são mais baratas de ler, porque o comprimento só precisa ser verificado uma vez.

sql-server database-internals
  • 1 respostas
  • 144 Views
Martin Hope
Mike S
Asked: 2021-09-29 12:02:43 +0800 CST

Por que o sinalizador de rastreamento do SQL Server 715 se comporta de maneira diferente da dica de consulta TABLOCK?

  • 2

É meu entendimento, com base em várias fontes (incluindo esta: https://techcommunity.microsoft.com/t5/sql-server/migrating-sap-workloads-to-sql-server-just-got-2-5x-faster /ba-p/384910 ) que o SQL Server Trace Flag 715 deve ser equivalente à dica de consulta TABLOCK - com a diferença de que TF715 pode ser definido nos níveis de sessão e global, enquanto TABLOCK só pode ser usado como uma dica de consulta.

Meu problema é que testei no SQL Servers 2016 e 2019 Development Editions no modelo de recuperação simples e estou obtendo resultados diferentes entre o TABLOCK e o TF715, independentemente de qual servidor eu uso. O TABLOCK está funcionando conforme o esperado e o TF715 não. Especificamente, TABLOCK diz ao SQL Server para remover um bloqueio de tabela inteiro para operações em massa e registrar minimamente a operação .

Considere o código a seguir. Isso insere 10.000 linhas em um heap.

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2

Agora, se você executar este próximo bloco de código, poderá ver que ele registrou 10.000 linhas.

SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

Ok, agora se fizermos tudo de novo usando a dica TABLOCK, você verá que se torna uma operação minimamente registrada (ou seja, a contagem de linhas totalmente registrada = 0).

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test WITH (TABLOCK) (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2
--0 Fully Logged Rows
SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

No entanto, quando tento habilitar o TF715 (e retirar a dica TABLOCK), ainda recebo 10.000 linhas totalmente registradas quando esperaria uma operação minimamente registrada.

--Enable TF715 on both a session and global level to cover all bases...
DBCC TRACEON(715)
GO
DBCC TRACEON(715, -1)
GO
DBCC TRACESTATUS
GO

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2

--10000 Fully Logged Rows
SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

DBCC TRACEOFF(715)
GO
DBCC TRACEOFF(715, -1)
GO
DBCC TRACESTATUS
GO

O que estou negligenciando? Eu não deveria precisar reiniciar o SQL Server para habilitar TFs por meio de DBCC, correto...?

Agradeço antecipadamente.

sql-server database-internals
  • 1 respostas
  • 89 Views
Martin Hope
sev
Asked: 2021-06-16 03:01:02 +0800 CST

Sugestão para sequências quase sem intervalos no postgres

  • 4

No PostgreSQL, as sequências são projetadas para ter lacunas pelos motivos mencionados neste post https://stackoverflow.com/questions/9984196/postgresql-gapless-sequences . Minha pergunta é: as sequências não poderiam ser feitas quase sem intervalos verificando periodicamente (digamos uma vez por dia) quais números de sequência não são usados ​​e adicionando-os de volta à sequência a ser usada?

Suponho que atualmente o postgres implementa uma sequência como um contador que incrementa toda vez que é acessado. Em vez disso, pode ser implementado com uma lista de valores livres e um contador. A sequência funcionaria da seguinte forma:

# python style pseudo code

class Sequence:
    def __init__(self):
        self.free_numbers_set = []
        self.counter = 0

    def get_next_sequence_value(self):
        if not isempty(self.free_numbers_set):
            id = self.free_numbers_set.pop(0)
        else:
            id = self.counter
            id ++

        return id

    def add_free_numbers(self, column):
        for i in range(0:self.counter):
            if not i in column:
                free_numbers_set.append(i)
        free_numbers_set.sort()

Toda vez que precisamos de um novo id, executamos get_next_sequence_value()e periodicamente executamosadd_free_numbers(column)

Atualizações que abordam algumas das perguntas

  1. Para colunas de identidade, obter os valores atualmente usados ​​seria trivial. Em outros casos caberia ao usuário fornecer uma lista de valores que já estão em uso.
  2. A interação com o MVCC precisaria ser pensada. Pode-se implementá-lo de forma que, durante a atualização dos valores ausentes, a sequência seja padronizada para apenas incrementar o contador - isso evitaria conflitos.

Acredito que esta solução poderia fornecer sequências menos esparsas que permitiriam aos usuários usar tipos de id menores (int vs bigint) sendo compatível com versões anteriores com a implementação atual.

postgresql database-internals
  • 1 respostas
  • 295 Views
Martin Hope
Govinda Sakhare
Asked: 2021-06-07 07:15:28 +0800 CST

Rastreando mensagens de front-end e back-end do Postgres

  • 1

De acordo com meu entendimento, quando executamos um comando ou consulta, o cliente Postgres envia uma mensagem de front-end e, em troca, obtém a resposta no formato de mensagem de back-end.

Como faço para capturar e verificar essas mensagens em uma caixa Linux?

Por exemplo, digamos que estou executando o comando abaixo via psqlcliente

 psql --username=foo --dbname=mydb --password=foobar

Acredito que o cliente cria StartupMessage .

Existe uma maneira de rastrear essa interação? Considerando que o servidor e o cliente estão sendo executados na mesma máquina.

postgresql database-internals
  • 2 respostas
  • 138 Views
Martin Hope
Paul White
Asked: 2020-08-30 06:55:14 +0800 CST

Evitar esperas de THREADPOOL devido ao corte de thread de trabalho ocioso

  • 12

Depois de ler Unusual THREADPOOL Waits de Josh Darnell, um usuário do Twitter mencionou que há um sinalizador de rastreamento não documentado para evitar o corte de trabalhadores ociosos :

tuitar

A ideia é que, uma vez que o SQL Server tenha criado threads suficientes para atender a carga de trabalho de pico, ele não deve aparar os threads de trabalho (liberando-os para o sistema operacional) após 15 minutos ou mais de não serem necessários.

Os threads de trabalho ociosos continuarão a usar recursos (por exemplo, memória), mas não haverá a explosão de THREADPOOLesperas quando mais trabalhos forem necessários de repente. Aparentemente, isso pode ser útil ao usar grupos de disponibilidade AlwaysOn.

O que é esse sinalizador de rastreamento não documentado e como ele funciona?

sql-server database-internals
  • 1 respostas
  • 536 Views
Martin Hope
Great Greek
Asked: 2020-08-12 09:33:40 +0800 CST

Requisitos de espaço de armazenamento para uma coluna varchar(40) para armazenar 'abcd' com charset 'ucs2' e 'utf8mb4'?

  • 1

Eu entendo que, se o comprimento for > 255, serão necessários 2 bytes para armazenar o prefixo de comprimento. Só preciso verificar minhas suposições. Por favor, diga-me o prefixo de comprimento e o comprimento de string('abcd') para charsets(latin1, ucs2, utf8mb4). Para uma coluna varchar(20). A documentação diz:

[...] Para a string 'abcd', L é 4 e o requisito de armazenamento é de cinco bytes. Se a mesma coluna for declarada para usar o conjunto de caracteres de byte duplo ucs2, o requisito de armazenamento é de 10 bytes : O comprimento de 'abcd' é oito bytes e a coluna requer dois bytes para armazenar comprimentos porque o comprimento máximo é maior que 255 (até 510 bytes). [...]

Referência: 11.7 Requisitos de armazenamento de tipo de dados (Oracle | Documentos)

Eu só não entendo por que para 'abcd' com charset 'ucs2' requer um prefixo de comprimento de 2 bytes mesmo depois de ser menor que 255.

mysql database-internals
  • 1 respostas
  • 108 Views
Martin Hope
abhishek
Asked: 2020-06-03 03:27:45 +0800 CST

qual é a diferença entre extensões uniformes e extensões mistas na estrutura de armazenamento de arquivos de banco de dados?

  • 1

Acabei de acessar alguns recursos dizendo:

extensões uniformes são de propriedade de um único objeto e extensões mistas podem ser compartilhadas por no máximo 8 objetos.

Mas não consigo entender o significado do insight, como qual é o benefício dessa estrutura? basicamente, eu sou novo neste campo, então se você pudesse fornecer alguns exemplos intuitivos e aplicações, seria muito apreciado.

sql-server database-internals
  • 1 respostas
  • 281 Views
Martin Hope
Hannah Vernon
Asked: 2019-07-23 11:52:10 +0800 CST

"Opção de proteção inválida"

  • 7

Na mensagem de erro a seguir, o motivo fornecido é "Opção de proteção inválida". O que isso indica?

O SQL Server detectou um erro de E/S baseado em consistência lógica: opção de proteção inválida

Para os fins desta pergunta, não preciso saber nada sobre "como executar o DBCC" ou "verificar se há corrupção". Eu entendi. Estou apenas curioso sobre a parte da "causa raiz" e o que poderia causar esse sabor do erro de E/S baseado em consistência lógica.

sql-server database-internals
  • 1 respostas
  • 487 Views
Martin Hope
Kimo
Asked: 2019-02-01 05:45:01 +0800 CST

Por que uma reconstrução de índice requer um bloqueio Sch-M?

  • 4

Não vejo por que uma reconstrução de índice exigiria um bloqueio Sch-M no índice fornecido.

sql-server database-internals
  • 2 respostas
  • 1425 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