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
b_c
Asked: 2023-10-18 23:44:04 +0800 CST

Manter uma coluna ordinal

  • 6

Preciso manter uma coluna que armazene uma ordem de classificação particionada por uma chave estrangeira de registro pai. A coluna deve conter os números de contagem contíguos e renumerar automaticamente os registros quando a ordem de classificação for alterada para um registro.

Aqui está o que tenho até agora:

CREATE TABLE SalesOrder (
    SalesOrderKey INT IDENTITY(1,1) NOT NULL 
    , CONSTRAINT PK_SalesOrder PRIMARY KEY (SalesOrderKey)
    , OrderName VARCHAR(50)
);

CREATE TABLE SalesOrderLine (
    LineKey INT IDENTITY(1,1) NOT NULL 
    , CONSTRAINT PK_Line PRIMARY KEY (LineKey)
    , SalesOrderKey INT NOT NULL 
    , CONSTRAINT FK_SalesOrderLine_SalesOrder FOREIGN KEY (SalesOrderKey) REFERENCES SalesOrder(SalesOrderKey)
    , LineNumber INT
    , LineNotes VARCHAR(50)
);
GO


CREATE TRIGGER NewOrderLine ON SalesOrderLine
AFTER INSERT
AS
BEGIN
    IF (ROWCOUNT_BIG() <> 1)
    RETURN;

    DECLARE @Line INT
        , @LineKey INT
        , @Key INT;

    SELECT @Key = SalesOrderKey
        , @LineKey = LineKey
        , @Line = LineNumber
    FROM inserted;

    -- If line number inserted, bump every line after that number
    UPDATE SalesOrderLine
    SET LineNumber += 1
    WHERE LineNumber >= @Line
        AND SalesOrderKey = @Key
        AND LineKey <> @LineKey;

    -- If line number inserted, set it to the last line
    UPDATE SalesOrderLine
    SET LineNumber = (
        SELECT MAX(LineNumber) + 1
        FROM SalesOrderLine
        WHERE SalesOrderKey = @Key)
    WHERE LineKey = @LineKey
        AND LineNumber IS NULL;

    -- Verify numbers are contiguous
    WITH num AS (
        SELECT LineKey id, 
            ROW_NUMBER() OVER (ORDER BY LineNumber) ln
        FROM SalesOrderLine
        WHERE SalesOrderKey = @Key
    )
    UPDATE SalesOrderLine
    SET LineNumber = ln
    FROM num
    WHERE LineKey = num.id;
END;
GO

CREATE TRIGGER UpdateLineNumber ON SalesOrderLine
AFTER UPDATE, DELETE
AS
BEGIN
    IF (ROWCOUNT_BIG() <> 1)
        RETURN;
    
    DECLARE @Line INT
        , @Key INT
        , @LineKey INT
        , @OldLine INT;
    
    SELECT @Line = LineNumber
    FROM inserted;

    SELECT @Key = SalesOrderKey
        , @LineKey = LineKey
        , @OldLine = LineNumber
    FROM deleted;

    -- Record moved up in list
    IF @OldLine > @Line
        UPDATE SalesOrderLine
        SET LineNumber += 1
        WHERE LineNumber >= @Line
            AND SalesOrderKey = @Key
            AND LineKey != @LineKey;
    ELSE -- Record moved down in list or deleted
        UPDATE SalesOrderLine
        SET LineNumber -= 1
        WHERE LineNumber BETWEEN @OldLine AND @Line
            AND SalesOrderKey = @Key
            AND LineKey != @LineKey;

    -- Verify numbers are contiguous
    WITH num AS (
        SELECT LineKey id, 
            ROW_NUMBER() OVER (ORDER BY LineNumber) ln
        FROM SalesOrderLine
        WHERE SalesOrderKey = @Key
    )
    UPDATE SalesOrderLine
    SET LineNumber = ln
    FROM num
    WHERE LineKey = num.id;
END;

Isso funciona, mas não parece ser a melhor maneira de conseguir isso. É viável usar apenas um gatilho contendo apenas uma instrução? Existe uma maneira melhor de fazer isso?

sql-server
  • 3 respostas
  • 257 Views
Martin Hope
Abhijith Ea
Asked: 2023-10-18 21:17:20 +0800 CST

Como identificar tabelas com problemas de tamanho de índice durante a migração do MySQL 5.7 para 8.0?

  • 6

Estou tentando migrar do MySQL 5.7 para o MySQL 8.0 para o banco de dados da minha aplicação. No entanto, a pré-verificação falhou com um erro de incompatibilidade "25", informando que tabelas com formatos de linha redundantes não podem ter um índice maior que 767 bytes. A mensagem de erro também menciona que apenas 50 índices são exibidos.

Existe uma consulta ou método para identificar as tabelas problemáticas no meu banco de dados? Preciso descobrir quais tabelas no meu ambiente de produção podem ser afetadas por esse problema.

mysql
  • 2 respostas
  • 49 Views
Martin Hope
Fajela Tajkiya
Asked: 2023-10-18 18:24:34 +0800 CST

Gerenciamento e compreensão dos threads de trabalho do SQL Server

  • 5

Olá comunidade do SQL Server,

Estou tentando aprofundar minha compreensão dos threads de trabalho do SQL Server, especialmente no que diz respeito à configuração máxima de threads de trabalho em um sistema OLTP ocupado. Atualmente estou trabalhando com o sys.dm_os_threadsDMV e explorando a melhor forma de otimizar o gerenciamento de threads em nosso servidor.

Meu entendimento atual é que o SQL Server gerencia automaticamente os threads de trabalho com base na carga de trabalho do sistema se a configuração padrão de máximo de threads de trabalho permanecer inalterada. O SQL Server pode alocar mais threads de trabalho para lidar com cargas de trabalho maiores e pode recuperar ou destruir esses threads quando as tarefas forem concluídas, embora isso possa não ocorrer imediatamente.

No entanto, não tenho certeza se meu entendimento está correto, principalmente quando se trata de situações em que o SQL Server pode ter atingido seu limite para a criação de novos threads. Se isso acontecer e ainda houver novas solicitações recebidas, isso poderá resultar em uma condição de 'agendador de impasse'? Recentemente, enfrentamos esse problema em nosso ambiente e estou tentando entender se essa pode ser a causa.

Diante desse contexto, tenho algumas perguntas:

  • Em um sistema OLTP ocupado, deveríamos considerar alterar a configuração máxima de threads de trabalho de seu valor padrão calculado pela fórmula da Microsoft?
  • Se devêssemos alterá-lo, deveria ser para um número maior que o padrão?
  • Qual a melhor forma de determinar o número ideal de threads de trabalho máximos para nosso ambiente específico para evitar o problema do 'agendador de deadlock'?

Seus insights ou conselhos sobre este assunto seriam muito apreciados. Obrigado.

sql-server
  • 1 respostas
  • 30 Views
Martin Hope
folow
Asked: 2023-10-18 14:58:03 +0800 CST

PostgreSQL – por que ele não usa o índice existente onde a chave primária é criada?

  • 5

IBM DB2

C:\>db2 create table public.tab1 (id int not null, col1 int not null)
C:\>db2  create unique index tab1_ix on public.tab1 (id) include (col1)
C:\>db2  alter table public.tab1 add primary key (id)
SQL0598W  Existing index "IN1139.TAB1_IX" is used as the index for the primary
key or a unique key.  SQLSTATE=01550

É apenas uma informação que o índice existente foi usado.


POSTGRESQL

db=# create table public.tab1 (id int not null, col1 int not null);
db=# create unique index tab1_ix on public.tab1 (id) include (col1);
db=# alter table public.tab1 add primary key (id);

db=# \d public.tab1;
                Table "public.tab1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           | not null |
 col1   | integer |           | not null |
Indexes:
    "tab1_pkey" PRIMARY KEY, btree (id)
    "tab1_ix" UNIQUE, btree (id) INCLUDE (col1)

PostgreSQL criou índice adicional para chave primária.

Por que isso é importante? a) Em muitos casos explicados, vi que se a chave primária for criada, o banco de dados usa o índice de chave primária para consultas. Mas se eu descartar a chave primária, o índice exclusivo e as consultas serão executadas muito mais rapidamente (por causa do Index Only Scan). b) Espaço adicional em disco é usado para índice de chave primária adicional. c) Cada atualização/inserção/exclusão e dois índices devem ser atualizados em vez de um.

Questões:

  1. Existe uma maneira de forçar o banco de dados PostgreSQL a usar o índice existente, quando a chave primária é adicionada à tabela com o índice exclusivo existente (como no IBM Db2)?
  2. Existe uma maneira de forçar o PostgreSQL a usar um índice exclusivo (e, portanto, usar o Index Only Scan) em vez do índice de chave primária (e usando apenas o Index Scan) quando as consultas são executadas?
postgresql
  • 1 respostas
  • 21 Views
Martin Hope
Jaikaran saini
Asked: 2023-10-18 12:11:02 +0800 CST

Como encontrar o tamanho total do cluster no PostgreSQL?

  • 6
Esta questão foi migrada do Stack Overflow porque pode ser respondida no Stack Exchange de administradores de banco de dados. Migrado há 2 dias .

Eu sei como encontrar a relação e o tamanho do banco de dados usando pg_total_relation_size()e pg_database_size(). Mas quero encontrar o tamanho total do cluster. Existe outra maneira além de calcular o espaço em disco do datadiretório usando o gerenciador de arquivos ou uma consulta como esta?

SELECT pg_size_pretty(sum(pg_database_size(datname))) AS "total databases size"
FROM pg_database;
postgresql
  • 1 respostas
  • 37 Views
Martin Hope
Eldar
Asked: 2023-10-18 05:23:01 +0800 CST

Mudança estranha no plano de consulta com base no limite

  • 6

Eu tenho um servidor PostgreSQL versão. 15.4 e tenho uma consulta como a abaixo:

SELECT i."Id"
FROM "InventoryItems"                                  i
         INNER JOIN "Products"                         p ON i."ProductBaseId" = p."Id"
         INNER JOIN (SELECT "CustomerMarketPlaceId", PLAINTO_TSQUERY('english', "Keyword") "Keyword"
                     FROM "RestrictedKeywords"
                     WHERE "CustomerMarketPlaceId" = 19100
                     LIMIT 158
                     ) z
                    ON z."CustomerMarketPlaceId" = i."CustomerMarketPlaceId"

WHERE i."CustomerMarketPlaceId" = 19100
  AND i."Status" IN (1, 2, 3, 4, 6, 7)
  AND TO_TSVECTOR('english', COALESCE(p."Title", '')) @@ z."Keyword";

Observe o estranho número 158 na subconsulta. Isso produz o plano de execução abaixo, que é legal, todos usando índices, varreduras somente de índice, varreduras de heap, etc.

Hash Join  (cost=1704.06..102240.40 rows=5758 width=8)
  Hash Cond: (p.""Id"" = i.""ProductBaseId"")"
  ->  Nested Loop  (cost=59.43..97792.89 rows=244027 width=8)
        ->  Subquery Scan on z  (cost=0.29..45.30 rows=79 width=36)
              Filter: (z.""CustomerMarketPlaceId"" = 19100)"
              ->  Limit  (cost=0.29..43.32 rows=158 width=36)
                    ->  Index Only Scan using ""IX_RestrictedKeywords_CustomerMarketPlaceId"" on ""RestrictedKeywords""  (cost=0.29..3199.81 rows=11747 width=36)"
                          Index Cond: (""CustomerMarketPlaceId"" = 19100)"
        ->  Bitmap Heap Scan on ""Products"" p  (cost=59.14..1206.42 rows=3089 width=132)"
              Recheck Cond: (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ z.""Keyword"")"
              ->  Bitmap Index Scan on ""IX_Products_Title""  (cost=0.00..58.37 rows=3089 width=0)"
                    Index Cond: (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ z.""Keyword"")"
  ->  Hash  (cost=1462.43..1462.43 rows=14576 width=16)
        ->  Index Scan using ""IX_InventoryItems_CustomerMarketPlaceId_Status"" on ""InventoryItems"" i  (cost=0.29..1462.43 rows=14576 width=16)"
              Index Cond: ((""CustomerMarketPlaceId"" = 19100) AND (""Status"" = ANY ('{1,2,3,4,6,7}'::integer[])))"

Mas quando altero esse número mágico para 159 , surge o plano de consulta abaixo:

Hash Join  (cost=50296.29..104375.05 rows=6195 width=8)
  Hash Cond: (i.""ProductBaseId"" = p.""Id"")"
  Join Filter: (to_tsvector('english'::regconfig, (COALESCE(p.""Title"", ''::character varying))::text) @@ z.""Keyword"")"
  ->  Nested Loop  (cost=0.58..16998.07 rows=1238960 width=44)
        ->  Index Scan using ""IX_InventoryItems_CustomerMarketPlaceId_Status"" on ""InventoryItems"" i  (cost=0.29..1462.43 rows=14576 width=16)"
              Index Cond: ((""CustomerMarketPlaceId"" = 19100) AND (""Status"" = ANY ('{1,2,3,4,6,7}'::integer[])))"
        ->  Materialize  (cost=0.29..48.86 rows=85 width=36)
              ->  Subquery Scan on z  (cost=0.29..48.43 rows=85 width=36)
                    Filter: (z.""CustomerMarketPlaceId"" = 19100)"
                    ->  Limit  (cost=0.29..46.32 rows=169 width=36)
                          ->  Index Only Scan using ""IX_RestrictedKeywords_CustomerMarketPlaceId"" on ""RestrictedKeywords""  (cost=0.29..3199.81 rows=11747 width=36)"
                                Index Cond: (""CustomerMarketPlaceId"" = 19100)"
  ->  Hash  (cost=30535.76..30535.76 rows=616876 width=132)
        ->  Seq Scan on ""Products"" p  (cost=0.00..30535.76 rows=616876 width=132)"

De repente, começa-se a pensar que a verificação completa da Productstabela terá um desempenho melhor na teoria, mas na prática, a consulta fica mais lenta em 100x (ou talvez mais). Tentei mudar default_statistics_targetpara um número maior e reanalisar as tabelas relacionadas na consulta não alterou o resultado. Eu tentei isso em ambientes de produção e de teste, a única diferença é o limite, pois o ambiente de produção tem mais RAM para trabalhar. O que está fazendo com que o PostgreSQL mude de ideia? (Acho que ele acha que a consulta não cabe na memória???) E por que está selecionando um plano de execução drasticamente pior? Mesmo que não use o giníndice, a consulta ainda pode ser filtrada pelo "InventoryItems"("CustomerMarketPlaceId","Status")índice.

Não sei se ajuda mas o índice usado na consulta é igual ao abaixo:

CREATE INDEX "IX_Products_Title"
    ON "Products" USING gin (TO_TSVECTOR('english'::REGCONFIG, COALESCE("Title", ''::CHARACTER VARYING)::TEXT));

Se eu refatorar a mesma consulta (mesmo se eu remover o limite na subconsulta) como a abaixo, ele escolherá um plano de execução melhor e, de fato, resultará em uma consulta muito mais rápida

SELECT i."Id"
FROM "InventoryItems"                                  i
         INNER JOIN "Products"                         p ON i."ProductBaseId" = p."Id"
         INNER JOIN (SELECT "CustomerMarketPlaceId", PLAINTO_TSQUERY('english', "Keyword") "Keyword"
                     FROM "RestrictedKeywords"
                    -- WHERE "CustomerMarketPlaceId" = 19100 
                    --- LIMIT 500
                     ) z
                    ON  TO_TSVECTOR('english', COALESCE(p."Title", '')) @@ z."Keyword" z."CustomerMarketPlaceId" = i."CustomerMarketPlaceId" 

WHERE i."CustomerMarketPlaceId" = 19100
  AND i."Status" IN (1, 2, 3, 4, 6, 7)
  AND TO_TSVECTOR('english', COALESCE(p."Title", '')) @@ z."Keyword"; -- <-- removing this condition will cause full scans

Produz este plano de execução:

Hash Join  (cost=1646.19..238317.48 rows=4281 width=8)
  Hash Cond: (p.""Id"" = i.""ProductBaseId"")"
  ->  Nested Loop  (cost=1.56..234592.40 rows=181124 width=4)
        ->  Index Only Scan using ""IX_RestrictedKeywords_CustomerMarketPlaceId"" on ""RestrictedKeywords""  (cost=0.29..263.06 rows=11747 width=11)"
              Index Cond: (""CustomerMarketPlaceId"" = 19100)"
        ->  Bitmap Heap Scan on ""Products"" p  (cost=1.28..19.80 rows=15 width=132)"
              Recheck Cond: ((to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ plainto_tsquery('english'::regconfig, (""RestrictedKeywords"".""Keyword"")::text)) AND (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ plainto_tsquery('english'::regconfig, (""RestrictedKeywords"".""Keyword"")::text)))"
              ->  Bitmap Index Scan on ""IX_Products_Title""  (cost=0.00..1.27 rows=15 width=0)"
                    Index Cond: ((to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ plainto_tsquery('english'::regconfig, (""RestrictedKeywords"".""Keyword"")::text)) AND (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ plainto_tsquery('english'::regconfig, (""RestrictedKeywords"".""Keyword"")::text)))"
  ->  Hash  (cost=1462.43..1462.43 rows=14576 width=12)
        ->  Index Scan using ""IX_InventoryItems_CustomerMarketPlaceId_Status"" on ""InventoryItems"" i  (cost=0.29..1462.43 rows=14576 width=12)"
              Index Cond: ((""CustomerMarketPlaceId"" = 19100) AND (""Status"" = ANY ('{1,2,3,4,6,7}'::integer[])))"

Quaisquer explicações que me ajudem a compreender essas seleções do plano de execução serão muito apreciadas.

Editar: adicionei explain (analyze,buffers)a saída das duas primeiras consultas de limite conforme solicitado no comentário:

Hash Join  (cost=1684.53..99640.82 rows=5780 width=8) (actual time=15.972..333.366 rows=1953 loops=1)
  Hash Cond: (p.""Id"" = i.""ProductBaseId"")"
  Buffers: shared hit=41110 dirtied=1513
  ->  Nested Loop  (cost=34.49..95801.34 rows=243616 width=8) (actual time=0.273..316.567 rows=47020 loops=1)
        Buffers: shared hit=39674 dirtied=1513
        ->  Subquery Scan on z  (cost=0.29..45.30 rows=79 width=36) (actual time=0.050..0.566 rows=158 loops=1)
              Filter: (z.""CustomerMarketPlaceId"" = 19100)"
              Buffers: shared hit=4
              ->  Limit  (cost=0.29..43.32 rows=158 width=36) (actual time=0.049..0.544 rows=158 loops=1)
                    Buffers: shared hit=4
                    ->  Index Only Scan using ""IX_RestrictedKeywords_CustomerMarketPlaceId"" on ""RestrictedKeywords""  (cost=0.29..3199.81 rows=11747 width=36) (actual time=0.048..0.528 rows=158 loops=1)"
                          Index Cond: (""CustomerMarketPlaceId"" = 19100)"
                          Heap Fetches: 0
                          Buffers: shared hit=4
        ->  Bitmap Heap Scan on ""Products"" p  (cost=34.20..1181.26 rows=3084 width=132) (actual time=0.127..1.960 rows=298 loops=158)"
              Recheck Cond: (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ z.""Keyword"")"
              Heap Blocks: exact=37818
              Buffers: shared hit=39670 dirtied=1513
              ->  Bitmap Index Scan on ""IX_Products_Title""  (cost=0.00..33.43 rows=3084 width=0) (actual time=0.096..0.096 rows=298 loops=158)"
                    Index Cond: (to_tsvector('english'::regconfig, (COALESCE(""Title"", ''::character varying))::text) @@ z.""Keyword"")"
                    Buffers: shared hit=1803
  ->  Hash  (cost=1467.12..1467.12 rows=14634 width=16) (actual time=11.340..11.340 rows=19978 loops=1)
        Buckets: 32768 (originally 16384)  Batches: 1 (originally 1)  Memory Usage: 1193kB
        Buffers: shared hit=1436
        ->  Index Scan using ""IX_InventoryItems_CustomerMarketPlaceId_Status"" on ""InventoryItems"" i  (cost=0.29..1467.12 rows=14634 width=16) (actual time=0.012..8.048 rows=19978 loops=1)"
              Index Cond: ((""CustomerMarketPlaceId"" = 19100) AND (""Status"" = ANY ('{1,2,3,4,6,7}'::integer[])))"
              Buffers: shared hit=1436
Planning:
  Buffers: shared hit=29
Planning Time: 0.753 ms
Execution Time: 333.540 ms
Hash Join  (cost=50366.43..107003.29 rows=6585 width=8) (actual time=414.038..86828.819 rows=2373 loops=1)
  Hash Cond: (i.""ProductBaseId"" = p.""Id"")"
  Join Filter: (to_tsvector('english'::regconfig, (COALESCE(p.""Title"", ''::character varying))::text) @@ z.""Keyword"")"
  Rows Removed by Join Filter: 3593667
  Buffers: shared hit=25883 dirtied=267, temp read=29576 written=29576"
  ->  Nested Loop  (cost=0.58..17982.15 rows=1317060 width=44) (actual time=0.045..591.422 rows=3596040 loops=1)
        Buffers: shared hit=1440
        ->  Index Scan using ""IX_InventoryItems_CustomerMarketPlaceId_Status"" on ""InventoryItems"" i  (cost=0.29..1467.12 rows=14634 width=16) (actual time=0.013..7.770 rows=19978 loops=1)"
              Index Cond: ((""CustomerMarketPlaceId"" = 19100) AND (""Status"" = ANY ('{1,2,3,4,6,7}'::integer[])))"
              Buffers: shared hit=1436
        ->  Materialize  (cost=0.29..52.01 rows=90 width=36) (actual time=0.000..0.008 rows=180 loops=19978)
              Buffers: shared hit=4
              ->  Subquery Scan on z  (cost=0.29..51.56 rows=90 width=36) (actual time=0.029..0.531 rows=180 loops=1)
                    Filter: (z.""CustomerMarketPlaceId"" = 19100)"
                    Buffers: shared hit=4
                    ->  Limit  (cost=0.29..49.31 rows=180 width=36) (actual time=0.028..0.507 rows=180 loops=1)
                          Buffers: shared hit=4
                          ->  Index Only Scan using ""IX_RestrictedKeywords_CustomerMarketPlaceId"" on ""RestrictedKeywords""  (cost=0.29..3199.81 rows=11747 width=36) (actual time=0.028..0.491 rows=180 loops=1)"
                                Index Cond: (""CustomerMarketPlaceId"" = 19100)"
                                Heap Fetches: 0
                                Buffers: shared hit=4
  ->  Hash  (cost=30610.49..30610.49 rows=616749 width=132) (actual time=349.356..349.356 rows=616749 loops=1)
        Buckets: 524288  Batches: 4  Memory Usage: 26496kB
        Buffers: shared hit=24443 dirtied=267, temp written=7668"
        ->  Seq Scan on ""Products"" p  (cost=0.00..30610.49 rows=616749 width=132) (actual time=0.004..178.437 rows=616749 loops=1)"
              Buffers: shared hit=24443 dirtied=267
Planning:
  Buffers: shared hit=29
Planning Time: 0.423 ms
Execution Time: 86829.206 ms
postgresql
  • 1 respostas
  • 67 Views
Martin Hope
JohnZastrow
Asked: 2023-10-18 04:59:58 +0800 CST

Coluna de atualização Mariadb durante o carregamento de dados de CSV

  • 6

Estou carregando arquivos .csv no Mariadb 10.6 usando LOAD DATA LOCAL INFILE.

Há uma coluna DATE chamada posted_onnos dados de entrada e preciso armazenar o nome do mês em outro campo monther, de preferência como parte do processo de carregamento.

Se postado_em = '2023-10-13' então mês = 'outubro'

Presumi que um gatilho seria apropriado e tentei variações (adicionadas NEW., antes/depois) do seguinte:

CREATE TRIGGER `t_add_monther` after INSERT ON `qn_txs` 
     FOR EACH ROW 
 UPDATE qn_txs SET NEW.qn_txs.`monther` = MONTHNAME(`posted_on`);

Mas não consigo superar o temido ERRO 1442 (HY000) na linha 1: Não é possível atualizar a tabela 'qn_txs' na função/gatilho armazenado porque ela já é usada pela instrução que invocou esta função/gatilho armazenado.

Alguma ideia? É necessária uma abordagem diferente?

mysql
  • 1 respostas
  • 35 Views
Martin Hope
ALiCe P.
Asked: 2023-10-18 01:45:33 +0800 CST

Como obter todos os usuários que possuem mais que um determinado número de mensagens?

  • 6

Eu tenho um banco de dados cujo diagrama ER se parece com este:

insira a descrição da imagem aqui

Eu me esforço para conseguir todos os usuários que tenham, por exemplo, mais de cinco mensagens. Consegui escrever uma consulta em python:

q = "SELECT user_id from users"
for row in cursor.execute(q):
    inner_cur = connect.cursor()
    n = inner_cur.execute("SELECT count(*) from messages WHERE user_id='{}' ".format(row[0])).fetchall()[0][0]
    # print("user_id =", row[0], "num of messages =", n)
    if n > 5:
        c = connect.cursor()
        print(c.execute("SELECT username from users WHERE user_id='{}' ".format(row[0])).fetchall()[0][0])

connect.commit()

Mas preciso fazer isso no DBeaver. Pensei que talvez precisasse usar join, countou group by, mas não consigo pensar em como. Alguém poderia explicar como fazer isso?

mysql
  • 1 respostas
  • 103 Views
Martin Hope
KaliTheGreat
Asked: 2023-10-17 21:41:32 +0800 CST

Como otimizar uma consulta em uma tabela grande, além de usar índice?

  • 6

Preciso de sugestões/ideias para otimizar a seguinte consulta:

SELECT COUNT(*) 
FROM (SELECT 1 
      FROM f 
      WHERE parent_sha256 = $1 
        AND parent_sha256 <> sha256 
      LIMIT 1) AS row_count;

O que é necessário para verificar se um parent_sha256 específico tem algum filho direto. A tabela é muito grande (50 milhões de linhas) e a consulta é muito lenta (6 a 12 minutos) quando há 700 mil a 900 mil linhas correspondentes, parent_sha256 = $1mas 0 linhas correspondentes parent_sha256 = $1 AND parent_sha256 <> sha256.

Nesse caso, o banco de dados deve ultrapassar todos os 700k ~ 900k.

Vale ressaltar que existem índices em parent_sha256e sha256.

postgresql
  • 2 respostas
  • 539 Views
Martin Hope
Brendan Maguire
Asked: 2023-10-17 21:41:24 +0800 CST

Postgres - É possível ter um `UNIQUE INDEX` com `NULLS NOT DISTINCT`?

  • 6

Dada esta definição de tabela com um índice parcial:

BEGIN;

CREATE TABLE user_note (
  user_id VARCHAR NOT NULL,
  item_id VARCHAR,
  note VARCHAR NOT NULL,
  archived_at TIMESTAMP
);

CREATE UNIQUE INDEX active_note
    ON user_note(user_id, item_id)
 WHERE archived_at IS NULL;

END;

Gostaria de garantir que haja apenas um valor onde (user_id, item_id)o registro não foi arquivado. Esta restrição não deve ser aplicada a registros com archived_atvalor não nulo (ou seja, devemos permitir muitos registros arquivados para um determinado (user_id, item_id)emparelhamento).

A restrição acima funciona conforme planejado quando user_ide item_idsão especificados:

BEGIN;
INSERT INTO user_note (user_id, item_id, note) VALUES ('user_1', 'item_1', 'A general note');
INSERT INTO user_note (user_id, item_id, note) VALUES ('user_1', 'item_1', 'A different note');
END;

Dá o seguinte erro:

BEGIN
INSERT 0 1
ERROR:  duplicate key value violates unique constraint "active_note"
DETAIL:  Key (user_id, item_id)=(user_1, item_1) already exists.
make: *** [populate] Error 1

Mas permite vários registros com line_idof NULL:

BEGIN;
INSERT INTO user_note (user_id, note) VALUES ('user_1', 'A general note');
INSERT INTO user_note (user_id, note) VALUES ('user_1', 'A different note');
END;

Saída:

BEGIN
INSERT 0 1
INSERT 0 1
COMMIT

Também tentei com um índice exclusivo com nulos não distintos assim:

BEGIN;

CREATE TABLE user_note (
  user_id VARCHAR NOT NULL,
  item_id VARCHAR,
  note VARCHAR NOT NULL,
  archived_at TIMESTAMP,

  UNIQUE NULLS NOT DISTINCT (user_id, item_id)
);

END;

Mas é claro que isso não leva em conta o archived_atvalor:

BEGIN;
INSERT INTO user_note (user_id, note, archived_at) VALUES ('user_1', 'A general note', CURRENT_TIMESTAMP);
INSERT INTO user_note (user_id, note, archived_at) VALUES ('user_1', 'A different note', CURRENT_TIMESTAMP);
END;

E recebo este erro indesejado:

BEGIN
INSERT 0 1
ERROR:  duplicate key value violates unique constraint "user_note_user_id_item_id_key"
DETAIL:  Key (user_id, item_id)=(user_1, null) already exists.
make: *** [populate] Error 1

Existe uma maneira de proibir múltiplas entradas para (user_id, item_id)quando archived_atfor, NULLmas permitir quando archived_atnão for NULL?

postgresql
  • 1 respostas
  • 31 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