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 / 问题

All perguntas(dba)

Martin Hope
Stark
Asked: 2024-10-08 00:20:06 +0800 CST

Azure SQL: problemas de desempenho do hierarchyid

  • 11

(Desculpas pela postagem longa - primeira postagem no SE)

Tenho usado o tipo hierarchyid em vários aplicativos por cerca de 10 anos e, no geral, estou satisfeito com o desempenho. Ocasionalmente, me deparei com relatos de desempenho ruim com hierarchyid e sempre presumi que era devido a índices ou consultas configurados incorretamente que poderiam ser otimizados. Mas agora eu mesmo me deparei com o problema.

Azure SQL, nível de compatibilidade de banco de dados definido como 160 (SQL Server 2022).

Tenho a seguinte tabela:

create table [Dim]
(
    [Key] [int] not null,
    [Path] [hierarchyid] null,
    [Name] [nvarchar](256) null,
    [ParentKey] [int] null,
    [SortOrder] [int] null,
    [IsLeaf] [bit] null,
    constraint PK_Dim primary key clustered ([Key]),
    index IX_Dim_Name unique ([Name]) include ([Path]),
    index IX_Dim_ParentKey unique ([ParentKey], [SortOrder]),
    index IX_Dim_Path ([Path]),
    index IX_Dim_Leaf ([IsLeaf], [Path])
)

A tabela é projetada para modelar uma hierarquia pai-filho. O campo Path reflete a hierarquia, com base no Path pai e no SortOrder do membro atual. Há 10.010 registros no conjunto de dados de teste com uma profundidade de hierarquia máxima de 8. Executamos a seguinte consulta:

select d.[Key], r.[SortOrder], r.[Key], r.[Name], r.[Level]
from (
    select row_number() over (order by d.[Path]) as [SortOrder], d.[Key], d.[Name], d.[Path].GetLevel() as [Level], d.[Path]
    from [Dim] d
    inner join [Dim] p on (d.[Path].IsDescendantOf(p.[Path]) = 1)
    where p.[Name] = 'A8'
) r
inner join [Dim] d on (d.[Path].IsDescendantOf(r.[Path]) = 1
        and d.[IsLeaf] = 1);

A consulta leva 14 segundos para ser executada e retorna 3.053 linhas. A subconsulta retorna 1.298 linhas. Abaixo está o plano de execução: Plano de execução da consulta - 1ª consulta e um link: https://www.brentozar.com/pastetheplan/?id=SydK3qIk1l

que parece muito com o que eu esperava, com exceção da varredura de índice em IX_Dim_Leaf, que lê 6.861.228 linhas. Detalhes da varredura do índice

Agora, se adicionarmos uma coluna adicional à tabela que contém a representação de string do campo Caminho e os dois índices correspondentes no novo campo:

alter table [Dim] add [PathStr] varchar(256);
go
update [Dim] set [PathStr] = [Path].ToString();
create index [IX_Dim_PathStr] on [Dim] ([PathStr]);
create index [IX_Dim_LeafStr] on [Dim] ([IsLeaf], [PathStr]);
go

e então reescreva a consulta para usar PathStr em vez de Path:

select d.[Key], r.[SortOrder], r.[Key], r.[Name], r.[Level]
from (
    select row_number() over (order by d.[PathStr]) as [SortOrder], d.[Key], d.[Name], d.[Path].GetLevel() as [Level], d.[PathStr]
    from [Dim] d
    inner join [Dim] p on (d.[PathStr] like p.[PathStr] + '%')
    where p.[Name] = 'A8'
) r
inner join [Dim] d on (d.[PathStr] like r.[PathStr] + '%'
    and d.[IsLeaf] = 1);

A nova consulta é executada em 0,064 segundos. O plano de execução está abaixo: Plano de execução da consulta - 2ª consulta e o link: https://www.brentozar.com/pastetheplan/?id=Sy5oT5Uyye

Na verdade, é mais complexo que o primeiro plano de consulta, pois o novo campo não está incluído no índice IX_Dim_Name e é preciso adicionar a string '%', mas a grande diferença está na varredura do índice externo, onde apenas 3.053 linhas são lidas em vez de 6,8 milhões. Detalhes da varredura do índice

Não faz sentido para mim que um campo de string tenha um desempenho melhor do que um campo hierarchyid que teoricamente é otimizado para esse tipo de consulta hierárquica. Estou fazendo algo errado ou o SQL Server é simplesmente incapaz de lidar com hierarchyids em subconsultas e devemos continuar com um campo de string?

Observação: armazenar os resultados da subconsulta em uma tabela var e, em seguida, unir a tabela var com a tabela Dim tem um desempenho marginalmente melhor ao usar hierarchyid, mas infelizmente isso não é uma opção.

Edição: seguindo a sugestão do Charlieface abaixo, também tentei esta consulta:

select d.[Key], r.[SortOrder], r.[Key], r.[Name], r.[Level]
from (
    select row_number() over (order by d.[Path]) as [SortOrder], d.[Key], d.[Name], d.[Path].GetLevel() as [Level], d.[Path]
    from [Dim] d
    inner join [Dim] p on (d.[Path].IsDescendantOf(p.[Path]) = 1)
    where p.[Name] = 'A8'
) r
inner join [Dim] d on (d.[Path].GetAncestor(1) = r.[Path]
        and d.[IsLeaf] = 1);

que executa em 38 ms ( execução do plano ). Parece que apenas IsDescendantOf() é um problema.

query-performance
  • 1 respostas
  • 73 Views
Martin Hope
RonJohn
Asked: 2024-10-06 20:26:58 +0800 CST

PRUNE LOGFILE PRIOR TO não está excluindo arquivos de log arquivados

  • 5

DB2 UDB 11.5.7.0

$ db2 get db cfg for PRPT01D | grep  LOGARCH
 First log archive method                 (LOGARCHMETH1) = DISK:/udb/alogs/
 Archive compression for logarchmeth1    (LOGARCHCOMPR1) = OFF
 Options for logarchmeth1                  (LOGARCHOPT1) = 
 Second log archive method                (LOGARCHMETH2) = OFF
 Archive compression for logarchmeth2    (LOGARCHCOMPR2) = OFF
 Options for logarchmeth2                  (LOGARCHOPT2) = 


$ db2 list history backup all for PRPT01D | head

                    List History File for PRPT01D

Number of matching file entries = 1


 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
 -- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20241006050916001   N    D  S0002434.LOG S0002434.LOG                
 ----------------------------------------------------------------------------
$ db2 "prune logfile prior to S0002323.LOG"
DB20000I  The PRUNE command completed successfully.

Mesmo depois de executar esse comando, os arquivos de log antigos ainda estão em /udb/alogs/udbinst/PRPT01D/NODE0000/LOGSTREAM0000/C0000000. Estou entendendo algo fundamentalmente errado? Posso apenas rmarquivar esses arquivos de log?

transaction-log
  • 1 respostas
  • 10 Views
Martin Hope
Sidharth Samant
Asked: 2024-10-06 13:41:51 +0800 CST

MySQL usando um índice multicoluna mesmo quando a primeira coluna não está sendo consultada

  • 9

Tenho o MySQL versão 8.0.37.

Pelo que entendi sobre um índice de múltiplas colunas nesta versão, ele será usado pelo MySQL SOMENTE se a consulta contiver um subconjunto de todas as colunas, começando pela primeira.

Por exemplo, tenho esse índice na minha tabela InnoDB

mysql> show indexes from my_table;
+------------------------+------------+------------------------------------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table    | Non_unique | Key_name                        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+------------------------+------------+------------------------------------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| my_table |          0 | PRIMARY                         |            1 | id          | A         |       32643 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| my_table |          1 | my_table_entity_id              |            1 | entity_id   | A         |       20160 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| my_table |          1 | my_table_entity_id_sub_id_value |            1 | entity_id   | A         |       18222 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| my_table |          1 | my_table_entity_id_sub_id_value |            2 | sub_id      | A         |       32985 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| my_table |          1 | my_table_entity_id_sub_id_value |            3 | value       | A         |       32545 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+------------------------+------------+------------------------------------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

Com my_table_entity_id_sub_id_valueo índice, posso executar consultas em entity_id, ou em ambos entity_ide sub_idou em todas as 3 colunas. Isso também é o que a documentação do MySQL diz.

Entretanto, esta é a explain analyzesaída de uma consulta apenas na 2ª e 3ª colunas, ou seja, sub_ide value, e ainda assim o índice está sendo usado.

mysql> explain analyze select distinct entity_id from my_table where sub_id = 107 and value  = 'd90e7a26-2fc5-4e16-87c5-a2e9da5a26f7';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Group (no aggregates)  (cost=3552 rows=330) (actual time=3.52..14.7 rows=3103 loops=1)
    -> Filter: ((my_table.`value` = 'd90e7a26-2fc5-4e16-87c5-a2e9da5a26f7') and (my_table.sub_id = 107))  (cost=3519 rows=330) (actual time=3.44..14.3 rows=3103 loops=1)
        -> Covering index scan on my_table using my_table_entity_id_sub_id_value  (cost=3519 rows=32985) (actual time=0.0741..10.4 rows=33202 loops=1)
 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.39 sec)

Percebo que é uma varredura de "índice de cobertura". O que entendo sobre elas é que são usadas para recuperar valores diretamente do índice, então entendo entity_idque o que estou selecting está naquele índice. No entanto, o whereainda está apenas na 2ª e 3ª colunas, e esse é o critério de filtragem.

Estou esquecendo de algo aqui? O que não estou entendendo sobre cobrir varreduras de índice?

mysql
  • 4 respostas
  • 479 Views
Martin Hope
Dan
Asked: 2024-10-06 05:32:13 +0800 CST

por que a recuperação de log do SQL Server é reproduzida no disco, em vez de na RAM

  • 6
Esta pergunta foi migrada do Stack Overflow porque pode ser respondida no Database Administrators Stack Exchange. Migrada há 7 dias .

Os documentos do SQL Server falam sobre aplicar transações confirmadas a arquivos de dados durante a recuperação de falhas, como se estivesse fazendo um checkpoint imediato. Isso deve acontecer antes de desfazer transações não confirmadas, o que deve acontecer para concluir o processo de recuperação.

Por que ele libera transações confirmadas para arquivos de dados imediatamente, em vez de apenas carregar dados sujos no cache RAM (da mesma forma que os dados eram armazenados em cache + logs, antes da falha) e então deixá-los ser gravados como parte do próximo checkpoint? Parece que isso poderia prolongar desnecessariamente o tempo de recuperação de falhas.

sql-server
  • 1 respostas
  • 89 Views
Martin Hope
user45867
Asked: 2024-10-06 05:55:09 +0800 CST

Como criar o menor backup compactado de bancos de dados do SQL Server destinados à exclusão?

  • 6

Preciso minimizar o armazenamento do SQL Server em preparação para migrar para a nuvem.

Há cerca de 10 bancos de dados que provavelmente são 99% lixo/necessários para exclusão. Talvez 100%. Bancos de dados de relatórios.

Qual é a melhor maneira de fazer algum tipo de "backup" compactado por apenas 6 meses? ... São cerca de 500 GB no total... os arquivos LDF e MDF seriam suficientes? (não economizaria em armazenamento, mas posso colocar em algum lugar barato).

É algo que é basicamente inútil, mas ocasionalmente algum caso marginal pode ser necessário para colocá-lo online. Não é provável, mas é possível.

Estou pensando que provavelmente há uma opção de backup suficiente. Não preciso de um ponto no tempo ou algo extravagante. Apenas "aqui estão os 10 dbs nesta data (digamos hoje) em caso de emergência". Esses são bancos de dados de relatórios amplamente autocontidos - não aplicativos complicados. Entendo que a corrupção pode ser possível de alguma forma, mas estou disposto a arriscar.

Esta também é uma versão vergonhosamente antiga do SQL Server, 2014, se isso for relevante.

sql-server
  • 1 respostas
  • 64 Views
Martin Hope
user1708730
Asked: 2024-10-05 22:09:39 +0800 CST

Soma contínua com valor parcial do último dia

  • 6

Não consigo descobrir como escrever uma consulta que retorne uma soma contínua por item com base em regras de outra tabela.

Abaixo está uma tabela que lista em ordem cronológica o valor do estoque de um item em dias específicos.

Tabela 1: Estoque

item estoque data
Lâmina 10 03/01/2020
Lâmina 20 04/01/2020
Lâmina 30 05/01/2020
Lâmina 40 06/01/2020
Lâmina 50 07/01/2020
Lâmina 60 08/01/2020
Lâmina 70 09/01/2020
Mesa 10 03/01/2020
Mesa 20 04/01/2020
Mesa 30 05/01/2020
Mesa 40 06/01/2020
Mesa 50 07/01/2020
Mesa 60 08/01/2020
Mesa 70 09/01/2020

Outra tabela tem duas regras para cada item sobre quantos dias são usados ​​para calcular os valores da soma contínua.

Tabela 2: Regra

item regra valor
Lâmina soma_cum 2,5
Lâmina soma_de_leads 2,5
Mesa soma_cum 3
Mesa soma_de_leads 3

Saída: cum_sum: Para Balde, data - 1/3/2020, a regra é 2,5 e, portanto, o valor = 10+20+30 * 0,5 lead_sum: Para Balde, data - 1/3/2020, a regra é 2,5 e, portanto, o valor = 20+30+40 * 0,5

Como escrevo a consulta para considerar valores parciais para a última data?

item estoque data soma_cum soma_de_leads
Lâmina 10 03/01/2020 45 70
Lâmina 20 04/01/2020 70 95
Lâmina 30 05/01/2020 95 120
Lâmina 40 06/01/2020 120 145
Lâmina 50 07/01/2020 145 130
Lâmina 60 08/01/2020 130 70
Lâmina 70 09/01/2020 70 0
Mesa 10 03/01/2020 60 90
Mesa 20 04/01/2020 90 120
Mesa 30 05/01/2020 120 150
Mesa 40 06/01/2020 150 180
Mesa 50 07/01/2020 180 130
Mesa 60 08/01/2020 130 70
Mesa 70 09/01/2020 70 0

https://sqlfiddle.com/postgresql/online-compiler?id=c87e6a47-0949-4781-b8b5-3559929a063d

postgresql
  • 1 respostas
  • 39 Views
Martin Hope
saceti
Asked: 2024-10-05 16:13:50 +0800 CST

Remover acesso direto ao mysql

  • 5

Devido a uma partição danificada, tive que migrar meus projetos para outra partição na qual instalei o linuxmint que por sua vez instalou o mysql Ver 8.0.39-0ubuntu0.22.04.1. Esta instalação do mysql permite acesso, pelo terminal, sem pedir usuário ou senha e isso não é bom para meus projetos ou para programas como o valentinaDB ou o DBeaver que costumo usar. Procurei em todos os lugares, mas nenhuma solução era a correta.

Recentemente encontrei uma solução que consistia em fazer um certo tipo de instalação mysql durante a qual eram solicitados tanto o usuário quanto a senha, mas não me lembro mais como fiz isso

mysql
  • 1 respostas
  • 26 Views
Martin Hope
Alex O
Asked: 2024-10-05 03:54:52 +0800 CST

UNNEST vs QUALQUER()

  • 7

Ao selecionar um número de registros de uma tabela Postgres com base em uma lista de IDs passada como parâmetro, quais são os benefícios e desvantagens de

SELECT id, <more...>
FROM tbl
INNER JOIN UNNEST($1) AS id USING (id)

contra

SELECT id, <more...>
FROM tbl
WHERE id = ANY($1)

e em quais casos um deve ser preferido ao outro?

DB: Postgres 14 e superior.

Nota: Esta não é uma duplicata de Obtendo por lista de ids: `unnest() JOIN` vs `= ANY()`, pois a lista não é constante.

postgresql
  • 1 respostas
  • 31 Views
Martin Hope
David Anderson
Asked: 2024-10-05 02:09:55 +0800 CST

Ajuste de banco de dados para resolver desempenho ruim

  • 6

Não sou um administrador de banco de dados, mas estou procurando conselhos sobre como ajustar nosso banco de dados MySQL. É uma pequena loja que está executando o Prestashop e fica atrasada por vários minutos ao salvar alterações em um pacote de produtos. Ou seja, um produto que é composto de 2 ou mais outros produtos.

Acabei de executar o MySQLTuner-Perl e parece estar tudo bem na maior parte, mas há vários pontos sinalizados para revisão.

[!!] Aborted connections: 6.83% (337899/4948004)
[!!] CPanel and Flex system skip-name-resolve should be on
[!!] Joins performed without indexes: 10213707

Suspeito que as 10 milhões de junções realizadas sem índices sejam as prováveis ​​culpadas aqui, mas não tenho certeza do que isso significa ou como deve ser resolvido.

O servidor tem toneladas de memória de sobra, então eu poderia aumentar a alocação de 2 a 3x como um curativo temporário, mas imagino que isso não será resolvido até que eu descubra o problema de indexação. Qualquer conselho ou esclarecimento sobre esses resultados seria muito apreciado.

insira a descrição da imagem aqui

mysql
  • 1 respostas
  • 20 Views
Martin Hope
Applez00800
Asked: 2024-10-04 15:44:08 +0800 CST

Como redefinir estatísticas em "pg_stats_subscription_stats"?

  • 5

Tenho alguns erros produzidos ao fazer alterações em algumas tabelas replicadas logicamente. Agora quero redefinir os erros registrados na pg_stat_subscription_statstabela na apply_error_countcoluna, mas não consigo encontrar nada em lugar nenhum me dizendo como fazer isso.
Eu tentei:

  • SELECT pg_stat_statements_reset()
  • SELECT pg_stat_reset()

Mas eles não redefiniram este campo...

Como faço para redefinir este campo?

Para referência, o abaixo está combinando pg_stats_subscriptionse pg_stat_subscription_statsmostra os apply_error_countvalores:

insira a descrição da imagem aqui

postgresql
  • 1 respostas
  • 75 Views
Prev
Próximo

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