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
ioxoi
Asked: 2024-04-13 04:04:44 +0800 CST

SQL Bulk Insert salva caracteres extras

  • 4

eu uso este código para inserção em massa

BULK INSERT [Table]
FROM 'D:\phones.txt'
WITH
(
   ROWTERMINATOR = '0x0a'
)

Meus dados têm apenas uma coluna de 10 caracteres

Por exemplo

| 1234567890 |    
| 1234567891 |    
| 1234567892 |

Após salvar no banco de dados, executando o código a seguir, mostra o comprimento dos dados mais

SELECT TOP (1)
[Phone]
,LEN([Phone]) AS Phonelength
FROM [Table]

resultado

Telefone Comprimento do telefone
1234567891 11

O caractere extra adicionado ao final do campo é a nova linha

Por que a nova linha foi adicionada?

sql-server
  • 1 respostas
  • 37 Views
Martin Hope
Yossi Geretz
Asked: 2024-04-13 03:10:45 +0800 CST

Estou tendo problemas para copiar usuários de banco de dados de um Azure SQL Server para outro. A permissão EXECUTE foi negada

  • 5

Estou tentando usar as instruções aqui -

https://learn.microsoft.com/en-US/troubleshoot/sql/database-engine/security/transfer-logins-passwords-between-instances

para copiar logins entre o servidor que hospeda meu banco de dados primário e o servidor que hospeda minha réplica de leitura. Isso é importante para mim porque quero que todos os meus usuários que estão atualmente consultando o banco de dados de produção comecem a consultar a réplica de leitura.

Consigo criar os sprocs no banco de dados master do servidor primário, mas quando tento executar o sproc, conforme as instruções, recebo o seguinte erro:

EXEC sp_help_revlogin

Msg 229, Nível 14, Estado 5, Procedimento sp_help_revlogin, Linha 1 [Batch Start Line 0] A permissão EXECUTE foi negada no objeto 'sp_help_revlogin', banco de dados 'master', esquema 'dbo'.

insira a descrição da imagem aqui

Como faço para superar isso?

Estou usando o banco de dados SQL hospedado do Azure e estou conectado ao servidor como administrador (usando a conta definida como Microsoft Entra Admin).

Obrigada pelo Conselho!

replication
  • 1 respostas
  • 11 Views
Martin Hope
John K. N.
Asked: 2024-04-12 20:31:19 +0800 CST

Por que o SQL Server exige LEFT JOIN para recuperar um status que não existe?

  • 7

Recentemente, consultei nossa ferramenta interna de inventário de banco de dados para obter uma lista de servidores, instâncias e bancos de dados e adicionei o status correspondente a cada servidor, instância e banco de dados.

Diagrama de Relacionamento

Server ˂-- 1 : n --˃ Instance ˂-- 1 : n --˃ Database
   ˄                    ˄                      ˄
   |                    |                      |
   |                  1 : 1                    |
   |                    |                      |
   |                    ˅                      |
   +-- 1 : 1 --˃     Status        ˂-- 1 : 1 --+

Leia como:
...um servidor pode ter múltiplas instâncias
...uma instância pode ter vários bancos de dados
...um servidor, uma instância e um banco de dados podem ter um status

Configurar

Tabela de status

CREATE TABLE [Status]
(
  StatusID int,
  StatusName char(20),
  );

Dados de status

INSERT INTO [Status] (StatusID, StatusName)
VALUES
(1,'Productive'),
(2,'Prod ACC'),
(3,'Prod APP'),
(4,'Test'),
(5,'Test ACC'),
(6,'Test APP'),
(7,'OFFLINE'),
(8,'Reserved'),
(9,'Decommisioned');

Tabela de servidores

CREATE TABLE [Server]
(
  ServerID int,
  ServerName char(20),
  ServerStatusID int
  );

Dados do servidor

INSERT INTO [Server] (ServerID, ServerName, ServerStatusID)
VALUES
(1,'FirstServer',1),
(2,'SecondServer',2),
(3,'ThirdServer',5),
(4,'FourthServer',8),
(5,'FifthServer',8);

Tabela de Instâncias

CREATE TABLE [Instance]
(
  InstanceID int,
  ServerID int,
  InstanceName char(30),
  InstanceStatusID int
  );

Dados da instância

INSERT INTO [Instance] 
  (InstanceID, ServerID, InstanceName, InstanceStatusID)
VALUES
(1,1,'GENERAL',1),
(2,1,'TAXES',1),
(3,2,'GENERAL',9),
(4,2,'SOCIAL',2),
(5,3,'GENERAL',5),
(6,3,'FBI',8),
(7,5,'COMINGSOON',8);

Tabela de banco de dados

CREATE TABLE [Database]
(
  DatabaseID int,
  InstanceID int,
  DatabaseName char(30),
  DatabaseStatusID int
  );

Dados do banco de dados

INSERT INTO [Database]
(DatabaseID, InstanceID, DatabaseName, DatabaseStatusID)
VALUES
(1,1,'master',1),
(2,1,'model',1),
(3,1,'msdb',1),
(4,1,'UserDB1',1),
(5,2,'master',1),
(6,2,'model',1),
(7,2,'msdb',1),
(8,2,'TaxesDB',1),
(9,4,'master',2),
(10,4,'model',2),
(11,4,'msdb',2),
(12,4,'HealthCareDB',2),
(13,5,'master',5),
(14,5,'model',5),
(15,5,'msdb',5),
(16,5,'GeneralUserDB',5),
(17,6,'master',8),
(18,6,'model',8),
(19,6,'msdb',8),
(20,6,'CriminalDB',8);

Instrução SELECT sem tabela de status envolvida

A instrução SELECT inicial envolvia simplesmente juntar as três tabelas: servidor, instância, banco de dados e era a seguinte:

-- Simple SELECT to get all information on Servers, Instances and Databases
-- The status of the server, instance or database is not returned
SELECT 
  ServerName, 
  InstanceName,
  DatabaseName 
  FROM [Server] as srv
    LEFT JOIN [Instance] as ins
      ON srv.ServerID = ins.ServerID
    LEFT JOIN [Database] as dbs
      ON ins.InstanceID = dbs.InstanceID;

Resultados de 1. Declaração

POR FAVOR, OBSERVE ISSO...

  • existe um servidor sem instância e banco de dados
  • há uma instância sem banco de dados
Nome do servidor Nome da instância Nome do banco de dados
Primeiro Servidor EM GERAL mestre
Primeiro Servidor EM GERAL modelo
Primeiro Servidor EM GERAL msdb
Primeiro Servidor EM GERAL UsuárioDB1
Primeiro Servidor IMPOSTOS mestre
Primeiro Servidor IMPOSTOS modelo
Primeiro Servidor IMPOSTOS msdb
Primeiro Servidor IMPOSTOS ImpostosDB
Segundo Servidor EM GERAL nulo
Segundo Servidor SOCIAL mestre
Segundo Servidor SOCIAL modelo
Segundo Servidor SOCIAL msdb
Segundo Servidor SOCIAL HealthCareDB
Terceiro Servidor EM GERAL mestre
Terceiro Servidor EM GERAL modelo
Terceiro Servidor EM GERAL msdb
Terceiro Servidor EM GERAL GeralUserDB
Terceiro Servidor FBI mestre
Terceiro Servidor FBI modelo
Terceiro Servidor FBI msdb
Terceiro Servidor FBI CriminalDB
Quarto Servidor nulo nulo
Quinto Servidor EM BREVE nulo

Instrução SELECT envolvendo tabela de status

Na próxima instrução decido adicionar o status a cada elemento (servidor, instância, banco de dados) e JOINeditar cada tabela com a Statustabela da seguinte forma:

-- Advanced SELECT to get all information on Servers, Instances and Databases 
-- including their status
SELECT 
  ServerName, 
  srvst.StatusName,
  InstanceName,
  insst.StatusName,
  DatabaseName,
  dbsst.StatusName
  FROM [Server] as srv
    JOIN [Status] as srvst
      ON srv.ServerStatusID = srvst.StatusID
    LEFT JOIN [Instance] as ins
      ON srv.ServerID = ins.ServerID
    JOIN [Status] as insst
      ON ins.InstanceStatusID = insst.StatusID
    LEFT JOIN [Database] as dbs
      ON ins.InstanceID = dbs.InstanceID
    JOIN [Status] as dbsst
      ON dbs.DatabaseStatusID = dbsst.StatusID
  ;

Resultados de 2. Declaração

Para minha surpresa o servidor sem instância e banco de dados e o servidor com instância mas sem banco de dados não estavam mais listados:

Nome do servidor StatusNome Nome da instância StatusNome Nome do banco de dados StatusNome
Primeiro Servidor Produtivo EM GERAL Produtivo mestre Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo modelo Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo msdb Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo UsuárioDB1 Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo mestre Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo modelo Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo msdb Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo ImpostosDB Produtivo
Segundo Servidor ACC de produção SOCIAL ACC de produção mestre ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção modelo ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção msdb ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção HealthCareDB ACC de produção
Terceiro Servidor Teste ACC EM GERAL Teste ACC mestre Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC modelo Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC msdb Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC GeralUserDB Teste ACC
Terceiro Servidor Teste ACC FBI Reservado mestre Reservado
Terceiro Servidor Teste ACC FBI Reservado modelo Reservado
Terceiro Servidor Teste ACC FBI Reservado msdb Reservado
Terceiro Servidor Teste ACC FBI Reservado CriminalDB Reservado

Descobertas / Solução

Depois de verificar várias opções com uma abordagem de tentativa e erro, descobri que JOINon the Statustable teve que ser alterado para a LEFT JOINpara permitir que a instrução exibisse o servidor sem uma instância ou um banco de dados e exibisse a instância sem um banco de dados :

-- Advanced SELECT to get all information on Servers, Instances and Databases 
-- including their status
SELECT 
  ServerName, 
  srvst.StatusName,
  InstanceName,
  insst.StatusName,
  DatabaseName,
  dbsst.StatusName
  FROM [Server] as srv
    LEFT JOIN [Status] as srvst
      ON srv.ServerStatusID = srvst.StatusID
    LEFT JOIN [Instance] as ins
      ON srv.ServerID = ins.ServerID
    LEFT JOIN [Status] as insst
      ON ins.InstanceStatusID = insst.StatusID
    LEFT JOIN [Database] as dbs
      ON ins.InstanceID = dbs.InstanceID
    LEFT JOIN [Status] as dbsst
      ON dbs.DatabaseStatusID = dbsst.StatusID;

Resultados de 3. Declaração

Nome do servidor StatusNome Nome da instância StatusNome Nome do banco de dados StatusNome
Primeiro Servidor Produtivo EM GERAL Produtivo mestre Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo modelo Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo msdb Produtivo
Primeiro Servidor Produtivo EM GERAL Produtivo UsuárioDB1 Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo mestre Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo modelo Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo msdb Produtivo
Primeiro Servidor Produtivo IMPOSTOS Produtivo ImpostosDB Produtivo
Segundo Servidor ACC de produção EM GERAL Desativado nulo nulo
Segundo Servidor ACC de produção SOCIAL ACC de produção mestre ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção modelo ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção msdb ACC de produção
Segundo Servidor ACC de produção SOCIAL ACC de produção HealthCareDB ACC de produção
Terceiro Servidor Teste ACC EM GERAL Teste ACC mestre Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC modelo Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC msdb Teste ACC
Terceiro Servidor Teste ACC EM GERAL Teste ACC GeralUserDB Teste ACC
Terceiro Servidor Teste ACC FBI Reservado mestre Reservado
Terceiro Servidor Teste ACC FBI Reservado modelo Reservado
Terceiro Servidor Teste ACC FBI Reservado msdb Reservado
Terceiro Servidor Teste ACC FBI Reservado CriminalDB Reservado
Quarto Servidor Reservado nulo nulo nulo nulo
Quinto Servidor Reservado EM BREVE Reservado nulo nulo

Material de referência

Aqui está um link para o db<>fiddle para reproduzir minhas descobertas.

Pergunta

Por que o SQL Server exige um LEFT JOINna Statustabela para itens filhos que não existem e para que a consulta exiba esses itens?

sql-server
  • 3 respostas
  • 431 Views
Martin Hope
Marcello Miorelli
Asked: 2024-04-12 20:00:05 +0800 CST

instantâneo para aplicar apenas as alterações de esquema - não os dados

  • 5

Estou restaurando bancos de dados em cada lado das minhas replicações transacionais e de mesclagem. Basicamente, a publicação e o assinante são inicialmente o mesmo banco de dados.

Ainda preciso executar o agente de snapshot para começar.

Como posso executar o snapshot sem executar os comandos bcp, ou seja, sem copiar os dados?

Estou bem com a estrutura de dados a ser copiada.

sql-server
  • 1 respostas
  • 28 Views
Martin Hope
laurent
Asked: 2024-04-12 18:43:42 +0800 CST

Qual índice pode ser criado para otimizar esta consulta?

  • 5

Eu tenho a consulta SQL abaixo que é executada de forma extremamente lenta. Quanto a esta consulta , isso se deve à instrução "ORDER BY", pois o Postgres está varrendo a changestabela por "contador" que pode ter milhões de valores. A remoção da instrução "ORDER BY" torna a consulta mais rápida.

Para a outra consulta mencionada acima, otimizei-a criando um índice em dois campos. Para esta consulta, entretanto, não tenho certeza de qual índice seria o correto. Tentei com um índice ativado, (item_id, counter)mas não ajudou em nada e não sei o que mais poderia tentar. Alguma sugestão?

Consulta SQL lenta:

SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
FROM "changes"
WHERE counter > -1
AND type = 2
AND item_id IN (SELECT item_id FROM user_items WHERE user_id = 'xxxx')
ORDER BY "counter" ASC
LIMIT 200;

EXPLICAR (ANALISAR, BUFFERS, CONFIGURAÇÕES) resultado:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=1001.15..27628.99 rows=200 width=99) (actual time=98730.912..116273.818 rows=200 loops=1)
   Buffers: shared hit=78113369 read=3224064 dirtied=3
   I/O Timings: read=137436.119
   ->  Gather Merge  (cost=1001.15..10431526.45 rows=78343 width=99) (actual time=98730.911..116273.783 rows=200 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         Buffers: shared hit=78113369 read=3224064 dirtied=3
         I/O Timings: read=137436.119
         ->  Nested Loop  (cost=1.13..10421483.70 rows=32643 width=99) (actual time=98493.185..112919.559 rows=75 loops=3)
               Buffers: shared hit=78113369 read=3224064 dirtied=3
               I/O Timings: read=137436.119
               ->  Parallel Index Scan using changes_pkey on changes  (cost=0.56..5949383.56 rows=6197986 width=99) (actual time=1.076..42523.117 rows=4075591 loops=3)
                     Index Cond: (counter > '-1'::integer)
                     Filter: (type = 2)
                     Rows Removed by Filter: 10370914
                     Buffers: shared hit=18993521 read=2672415
                     I/O Timings: read=85551.814
               ->  Index Scan using user_items_item_id_index on user_items  (cost=0.56..0.72 rows=1 width=23) (actual time=0.017..0.017 rows=0 loops=12226772)
                     Index Cond: ((item_id)::text = (changes.item_id)::text)
                     Filter: ((user_id)::text = 'xxxx'::text)
                     Rows Removed by Filter: 1
                     Buffers: shared hit=59119848 read=551649 dirtied=3
                     I/O Timings: read=51884.305
 Settings: effective_cache_size = '16179496kB', jit = 'off', work_mem = '100000kB'
 Planning Time: 1.465 ms
 Execution Time: 116273.929 ms
(26 rows)

Índices:

"changes_pkey" PRIMARY KEY, btree (counter)
"changes_id_index" btree (id)
"changes_id_unique" UNIQUE CONSTRAINT, btree (id)
"changes_item_id_index" btree (item_id)
"changes_user_id_counter_index" btree (user_id, counter)
"changes_user_id_index" btree (user_id)
postgresql
  • 3 respostas
  • 62 Views
Martin Hope
Björn Morén
Asked: 2024-04-12 13:37:18 +0800 CST

LEFT JOIN LATERAL com um resultado de função, como evitar chamadas de função desnecessárias?

  • 4

Tenho uma função cara e ela só fornece dados relevantes quando certas condições são atendidas. Esses dados são inseridos no resultado através de LEFT JOIN LATERAL conforme mostrado abaixo. Da forma como funciona agora, a função é chamada para cada linha.

Existe uma maneira de reescrevê-lo para que seja chamado apenas para linhas onde t1.type é igual a 5? O exemplo abaixo ainda chama a função para cada linha, embora eu tenha uma condição definida.

SELECT t1.name, t1.type, t2.col1, t2.col2
FROM table1 t1
LEFT JOIN LATERAL function_name(t1.col1, t1.col2) AS t2 ON t1.type = 5;

Caso de teste:

CREATE TABLE table1 (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    type INTEGER,
    col1 INTEGER,
    col2 INTEGER
);

-- Sample data for table1
INSERT INTO table1 (name, type, col1, col2)
VALUES
    ('Row 1', 5, 10, 20),
    ('Row 2', 7, 15, 25),
    ('Row 3', 10, 30, 40); 

CREATE OR REPLACE FUNCTION function_name(col1_arg INTEGER, col2_arg INTEGER)
RETURNS TABLE (col1 INTEGER, col2 INTEGER)
AS $$
BEGIN
    RAISE LOG 'Function called';
    RETURN QUERY SELECT col1_arg * 2 AS col1, col2_arg * 3 AS col2;
END;
$$ LANGUAGE plpgsql;


-- Test Query
SELECT t1.name, t1.type, t2.col1, t2.col2
FROM table1 t1
LEFT JOIN LATERAL function_name(t1.col1, t1.col2) AS t2 ON t1.type = 5;
postgresql
  • 2 respostas
  • 31 Views
Martin Hope
Yossi Geretz
Asked: 2024-04-12 06:51:29 +0800 CST

Posso criar uma réplica de leitura do meu banco de dados SQL Server primário do Azure em um servidor diferente com um nome diferente?

  • 6

Eu tenho um banco de dados chamado myAppDB em um SQL Server hospedado no Azure no Datacenter do Leste dos EUA. Criei um novo SQL Server no datacenter Centro-Sul dos EUA. Em seguida, criei uma réplica geográfica do myAppDB no servidor no leste dos EUA para o servidor no centro-sul dos EUA. Funcionou! Validei que o novo banco de dados é de fato somente leitura do SSMS e que os dados estão sendo bombeados à medida que o banco de dados primário é atualizado com transações em andamento.

O problema é que a interface do Azure para criar a réplica não permite a especificação do nome do banco de dados para a réplica.

insira a descrição da imagem aqui

Agora tenho dois bancos de dados diferentes em dois servidores diferentes, ambos com o mesmo nome - myAppDB . Fisicamente isso funciona, mas em termos de usabilidade, se estou trabalhando no SSMS com duas conexões de servidor de banco de dados, é confuso porque independente de qual banco de dados estou acessando, o SSMS reporta myAppDB . Prefiro que a réplica tenha um nome como myAppDB_Read apenas para trazer um pouco mais de clareza ao meu ambiente de trabalho. Existe alguma maneira de conseguir isso? (Já tentei o método padrão para renomear um banco de dados, mas recebi uma mensagem de erro informando que a operação não pode ser executada porque o banco de dados está em um relacionamento de replicação.)

Obrigada pelo Conselho!

replication
  • 1 respostas
  • 14 Views
Martin Hope
Wayne Cochran
Asked: 2024-04-12 03:14:24 +0800 CST

Servidores vinculados em SQL Server AGs

  • 5

Ao configurar servidores vinculados em um grupo de disponibilidade, preciso configurar os servidores vinculados no ouvinte do AG, bem como nos nós do AG? Herdei um AG de 2 nós que atualmente possui um conjunto de servidores vinculados no ouvinte e nos nós individuais (portanto, no SSMS, se eu me conectar aos nós e ao ouvinte, os servidores vinculados aparecerão em todos os três). Preciso adicionar um novo servidor vinculado, por isso não tenho certeza se preciso adicioná-lo no ouvinte ou apenas nos nós. Um de nossos desenvolvedores configurou o servidor vinculado no nó ativo e a conexão funcionou quando ele executou um script de teste conectado diretamente ao nó ativo, mas não conseguiu se conectar ao servidor vinculado se tentasse executar o script enquanto estava conectado ao ouvinte. Tivemos um problema semelhante ao executar procedimentos armazenados do banco de dados MASTER se o sp não estivesse instalado no ouvinte, mesmo que estivesse instalado no MASTER em ambos os nós. Não tenho certeza se esse é um comportamento normal ou se o AG foi configurado de alguma forma não padrão que está impedindo o funcionamento de sp's e servidores vinculados que não estão configurados no próprio ouvinte.

sql-server
  • 1 respostas
  • 13 Views
Martin Hope
Sascha Mayr
Asked: 2024-04-11 23:55:04 +0800 CST

Como consultar sequências agregadas?

  • 7

Meu objetivo é detectar tendências de preços de criptomoedas. Para isso, estou obtendo dados de preços OHLC para múltiplas moedas versus vários símbolos de cotação (por exemplo, velas para Bitcoin/USD, Bitcoin/EUR, Litecoin/USD etc.). Para realizar o cálculo de tendências utilizo o indicador Supertrend . Eu tenho as 2 tabelas a seguir:

-- This is where price candles AKA OHLC data gets stored. Interval can be '1h', '4h', '1d', etc.
CREATE TABLE ohlc (
    id integer DEFAULT nextval('ohlc_id_seq'::regclass) PRIMARY KEY,
    open numeric(65,30) NOT NULL,
    high numeric(65,30) NOT NULL,
    low numeric(65,30) NOT NULL,
    close numeric(65,30) NOT NULL,
    coinid character varying(255) NOT NULL REFERENCES coin(id) ON DELETE RESTRICT ON UPDATE CASCADE,
    closetime timestamp(3) without time zone NOT NULL,
    quotesymbol text NOT NULL,
    interval text NOT NULL
);

-- This is a caching table that gets automatically populated by a stored procedure that runs AFTER every ohlc insert. "trend" can be 'UP' or 'DOWN'.
CREATE TABLE supertrend (
    id integer DEFAULT nextval('supertrend_id_seq'::regclass) PRIMARY KEY,
    coinid character varying(255) NOT NULL REFERENCES coin(id) ON DELETE RESTRICT ON UPDATE CASCADE,
    quotesymbol text NOT NULL,
    date timestamp(3) without time zone NOT NULL,
    trend text NOT NULL,
    interval text NOT NULL
);

Dados de amostra para a tabela de supertendências:

coinid símbolo de citação data tendência intervalo
'Bitcoin' 'USD' '2024-04-18 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'USD' '2024-04-17 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'USD' '2024-04-16 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'USD' '2024-04-15 00:00:00' 'ABAIXO' '1d'
'Bitcoin' 'EUR' '2024-04-18 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'EUR' '2024-04-17 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'EUR' '2024-04-16 00:00:00' 'ABAIXO' '1d'
'Bitcoin' 'EUR' '2024-04-15 00:00:00' 'ABAIXO' '1d'
'Bitcoin' 'CNY' '2024-04-18 00:00:00' 'ABAIXO' '1d'
'Bitcoin' 'CNY' '2024-04-17 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'CNY' '2024-04-16 00:00:00' 'ACIMA' '1d'
'Bitcoin' 'CNY' '2024-04-15 00:00:00' 'ACIMA' '1d'
'Litecoin' 'USD' '2024-04-18 00:00:00' 'ABAIXO' '1d'
'Litecoin' 'USD' '2024-04-17 00:00:00' 'ACIMA' '1d'
'Litecoin' 'USD' '2024-04-16 00:00:00' 'ABAIXO' '1d'
'Litecoin' 'USD' '2024-04-15 00:00:00' 'ABAIXO' '1d'
'Bitcoin' 'USD' '2024-04-18 00:00:00' 'ACIMA' '4h'
'Bitcoin' 'USD' '2024-04-17 20:00:00' 'ACIMA' '4h'
'Bitcoin' 'USD' '2024-04-17 16:00:00' 'ABAIXO' '4h'

Digamos que eu queira consultar a ORDER BY date DESCtendência mais recente () para cada coinid/quotesymbol com intervalo = '1d' (1 dia). Ou, em outras palavras WHERE interval = '1d' GROUP BY coinid, quotesymbol, quero também saber a tendência da tendência, por quantos períodos essa tendência já é a mesma.

Dados os dados da tabela de supertendências do exemplo acima, meu resultado deve ser semelhante a:

coinid símbolo de citação última tendência tendência_streak
'Bitcoin' 'USD' 'ACIMA' 3
'Bitcoin' 'EUR' 'ACIMA' 2
'Bitcoin' 'CNY' 'ABAIXO' 1
'Litecoin' 'USD' 'ABAIXO' 1

Para esclarecer o resultado acima: 'Bitcoin', 'usd' está 'UP' por 3 períodos, porque a tendência para Bitcoin/USD foi de alta em 18 de abril, 17 de abril e 16 de abril. E 'DOWN' em 15 de abril, veja o exemplo tabela de supertendências.

Além disso, gostaria de saber a supertendência agregada sobre todos os símbolos de cotação (via função de modo). Esse resultado deve ficar assim:

coinid última tendência tendência_streak
'Bitcoin' 'ACIMA' 2
'Litecoin' 'ABAIXO' 1

Para esclarecer o resultado acima: A tendência mais recente do Bitcoin/USD é 'UP, Bitcoin/EUR é 'EUR' é 'UP' e Bitcoin/CNY é 'DOWN'. A função mode pega ('UP', 'UP', 'DOWN') e retorna o valor que ocorre mais frequentemente ('UP').

Como posso consultar esses dados de maneira eficiente, considerando que a tabela de supertendências tem milhões ou bilhões de linhas?

Eu estava pensando em uma visão materializada, mas os intervalos mais baixos possíveis para essas supertendências são de 1 minuto e podem ser escritos em momentos distintos, de modo que pode ser uma taxa de atualização necessária muito alta.

Estou tentando evitar o uso de uma solução de cache separada como o Redis para manter simples a quantidade de arquitetura/ambientes necessários, mas acho que isso poderia ser uma opção especialmente para contadores.

postgresql
  • 1 respostas
  • 124 Views
Martin Hope
laurent
Asked: 2024-04-11 18:42:32 +0800 CST

Consulta extremamente lenta sempre que usar ORDER BY, mesmo quando um índice estiver presente

  • 5

Tenho tentado depurar uma consulta particularmente lenta que nunca é concluída (leva uma eternidade e eventualmente atinge o tempo limite) e descobri que tudo se resume à ORDER BYafirmação: se estiver lá, nunca será concluída; se eu removê-la, ela retornará instantaneamente.

Minha suposição era que não havia índice nesse campo, mas descobri que existe um:

CREATE UNIQUE INDEX changes_pkey ON public.changes USING btree (counter)

No entanto, isso não parece fazer nenhuma diferença, então estou me perguntando qual poderia ser o motivo? Talvez seja porque é um "ÍNDICE ÚNICO" diferente dos outros índices desta tabela?

Confira abaixo as dúvidas:

Nunca complete:

SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
FROM "changes"
WHERE counter > -1
AND (type = 1 OR type = 3)
AND user_id = 'xxxxxxx'
ORDER BY "counter" ASC
LIMIT 200

Conclui instantaneamente:

SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
FROM "changes"
WHERE counter > -1
AND (type = 1 OR type = 3)
AND user_id = 'xxxxxxx'
LIMIT 200

Índices nessa tabela:

changes              | changes_id_index                          | CREATE INDEX changes_id_index ON public.changes USING btree (id)
changes              | changes_id_unique                         | CREATE UNIQUE INDEX changes_id_unique ON public.changes USING btree (id)
changes              | changes_item_id_index                     | CREATE INDEX changes_item_id_index ON public.changes USING btree (item_id)
changes              | changes_pkey                              | CREATE UNIQUE INDEX changes_pkey ON public.changes USING btree (counter)
changes              | changes_user_id_index                     | CREATE INDEX changes_user_id_index ON public.changes USING btree (user_id)
postgres=> EXPLAIN SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
postgres-> FROM "changes"
postgres-> WHERE counter > -1
postgres-> AND (type = 1 OR type = 3)
postgres-> AND user_id = 'xxxxxxxx'
postgres-> ORDER BY "counter" ASC
postgres-> LIMIT 200;
                                             QUERY PLAN
-----------------------------------------------------------------------------------------------------
 Limit  (cost=0.56..9206.44 rows=200 width=99)
   ->  Index Scan using changes_pkey on changes  (cost=0.56..5746031.01 rows=124834 width=99)
         Index Cond: (counter > '-1'::integer)
         Filter: (((user_id)::text = 'xxxxxxxx'::text) AND ((type = 1) OR (type = 3)))
(4 rows)

* EXPLAIN para a consulta rápida:

postgres=> EXPLAIN SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
postgres-> FROM "changes"
postgres-> WHERE counter > -1
postgres-> AND (type = 1 OR type = 3)
postgres-> AND user_id = 'xxxxxxxx'
postgres-> LIMIT 200;
                                              QUERY PLAN
------------------------------------------------------------------------------------------------------
 Limit  (cost=0.56..1190.09 rows=200 width=99)
   ->  Index Scan using changes_user_id_index on changes  (cost=0.56..742468.10 rows=124834 width=99)
         Index Cond: ((user_id)::text = 'xxxxxxxx'::text)
         Filter: ((counter > '-1'::integer) AND ((type = 1) OR (type = 3)))
(4 rows)

Alguma ideia de qual poderia ser o motivo dessa consulta lenta?

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