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
Dragos Miron
Asked: 2024-03-13 19:09:40 +0800 CST

Aplicar exclusividade na combinação de colunas + função agregada

  • 6

Tenho um banco de dados SQL Server com as seguintes tabelas:

insira a descrição da imagem aqui

    CREATE TABLE [dbo].[Rule]
    (
        [RuleId] [int] IDENTITY(1,1) NOT NULL,
        [Value1] [int] NOT NULL,
        [Value2] [int] NOT NULL,
        [Value3] [int] NOT NULL,
     CONSTRAINT [PK_Rule] PRIMARY KEY CLUSTERED ([RuleId] ASC)
     )
     GO
    
    CREATE TABLE [dbo].[Type]
    (
        [TypeId] [INT] IDENTITY(1,1) NOT NULL,
        [Description] [varchar](50) NOT NULL,
    CONSTRAINT [PK_Type] PRIMARY KEY CLUSTERED ([TypeId] ASC)
    )
    GO
    
     CREATE TABLE [dbo].[RuleType]
     (
        [RuleId] [int] NOT NULL,
        [TypeId] [int] NOT NULL,
     CONSTRAINT [PK_RuleType] PRIMARY KEY CLUSTERED ([RuleId] ASC,  [TypeId] ASC)
    )
    GO
    
    ALTER TABLE [dbo].[RuleType]  WITH CHECK ADD  CONSTRAINT [FK_RuleType_Type] FOREIGN KEY([TypeId])
    REFERENCES [dbo].[Type] ([TypeId])
    GO
    
    ALTER TABLE [dbo].[RuleType] CHECK CONSTRAINT [FK_RuleType_Type]
    GO
    
    ALTER TABLE [dbo].[RuleType]  WITH CHECK ADD  CONSTRAINT [FK_RuleType_Rule] FOREIGN KEY([RuleId])
    REFERENCES [dbo].[Rule] ([RuleId])
    GO
    
    ALTER TABLE [dbo].[RuleType] CHECK CONSTRAINT [FK_RuleType_Rule]
    GO

/*Test data*/
INSERT INTO [dbo].[Type] ([Description]) VALUES ('Type1'), ('Type2'), ('Type3');
GO

INSERT INTO [dbo].[Rule] ([Value1], [Value2], [Value3]) VALUES (1,1,1), (2,2,2), (3,3,3);
GO

INSERT INTO [dbo].[RuleType] ([RuleId], [TypeId]) VALUES (1,1), (1,2), (1,3), (2,2), (2,3);
GO

O procedimento armazenado a seguir retorna todas as regras e um valor agregado de seus tipos associados:

CREATE OR ALTER PROCEDURE SelectRules
AS

    SELECT 
        R.[RuleId], 
        R.[Value1], 
        R.[Value2], 
        R.[Value3],
        [AssoctiatedTypes]  = STRING_AGG(RT.TypeId, ', ')
    FROM
        [dbo].[Rule] R
    LEFT JOIN
        [dbo].[RuleType] RT ON RT.RuleId = R.RuleId
    GROUP BY
        R.[RuleId], 
        R.[Value1], 
        R.[Value2], 
        R.[Value3]
GO 

insira a descrição da imagem aqui

Pergunta:

Existe uma maneira de impor exclusividade na combinação Value1, Value2, Value3 e AssociatedTypes?

O que preciso evitar é a criação de uma nova regra com os mesmos valores (Valor1, Valor2 e Valor3) e os mesmos tipos associados de uma regra existente. A mesma aplicação deverá aplicar-se à atualização de uma regra existente.

sql-server
  • 3 respostas
  • 74 Views
Martin Hope
Peter
Asked: 2024-03-13 17:06:45 +0800 CST

postgres: fuso horário da sessão de outras sessões

  • 5

Nosso fuso horário do banco de dados é UTC. Às vezes, tenho usuários que se esquecem de alterar o fuso horário da sessão para UTC e, em seguida, obtêm um comportamento indesejado (por exemplo, ao usar now()).

Existe uma maneira de

  1. Forçar todas as sessões para o fuso horário UTC?
  2. Pelo menos forçá-los uma vez ao conectar?
  3. Consulte todas as sessões, quais configurações de fuso horário elas usam? pg_stat_activitynão parece conter essa informação.

Exemplo porque timestampnão resolve todos os meus problemas:

create table a (c timestamp);
reset timezone;
show timezone; -- UTC
insert into a select now();
select * from a; -- 2024-03-13 12:50:14.515
set timezone to 'UTC+9';
show timezone; -- UTC+9
truncate a;
insert into a select now();
select * from a; -- 2024-03-13 03:50:48.376
reset timezone;
show timezone; -- UTC
select * from a; -- 2024-03-13 03:51:22.854
postgresql
  • 1 respostas
  • 28 Views
Martin Hope
David McNeill
Asked: 2024-03-13 11:58:58 +0800 CST

Como faço para converter um varchar de json aninhado em jsonb e depois nivelá-lo?

  • 5

O Apache Hop não possui processamento json rico, então estou enviando os dados para o postgres para fazer o trabalho

Com um blob de json profundamente aninhado (exemplo de subconjunto abaixo), como posso nivelar e armazenar o resultado? Vou recuperá-lo com Hop e continuar o processamento. A saída final é csv.

Algo como

atualizar um conjunto de tabelas flat_json = flatten(nested_json) onde id = 1;

Esse recorte de jq faz isso, qual é o equivalente em pg?

echo '[{"value": {
"id":"1",
"desc":"widget",
"colours":[{
     "hue":"red",
     "tint":"light"
     },{
     "hue":"green",
     "tint":"light"
     },{
     "hue":"blue",
     "tint":"dark"
     }],
"isActive":true
}}]' | jq '[.[] |
[leaf_paths as $path | {"key": $path | join("_"), "value": getpath($path)}]
| from_entries]
'

result
[
{
"value_id": "1",
"value_desc": "widget",
"value_colours_0_hue": "red",
"value_colours_0_tint": "light",
"value_colours_1_hue": "green",
"value_colours_1_tint": "light",
"value_colours_2_hue": "blue",
"value_colours_2_tint": "dark",
"value_isActive": true
}
]

Se esta é uma ideia deselegante, existe uma maneira concisa de enviar o json para colunas criadas automaticamente? (existem cerca de 200) Ou enviar o json aninhado para uma coleção de tabelas (widgets, cores, mais) vinculadas por chaves estrangeiras geradas automaticamente? Os dados reais possuem um aninhamento mais profundo do que o exemplo mostrado.

postgresql
  • 1 respostas
  • 42 Views
Martin Hope
Viper75
Asked: 2024-03-13 07:00:36 +0800 CST

Como posso obter uma média de um conjunto de dados de consulta no SQL Server?

  • 7

Estou construindo um sistema de inventário de peças e tenho uma tabela de transações que armazena a frequência de uso de um item.
Digamos que o item A seja usado 10 vezes em 2021, 20 em 2022 e 30 em 2023. É claro que cada transação ocorre em um dia diferente ao longo de cada ano. Então, usando

SELECT ItemNumber, SUM(QuantityUsed), YEAR(DateUsed)
FROM ItemTransactions
GROUP BY ItemNumber, YEAR(DateUsed)
WHERE ItemNumber = 1001

Posso saber quantos foram usados ​​​​a cada ano. Minha pergunta é como posso obter o uso médio anual deste conjunto de dados? Tenho tentado usar uma subconsulta, mas não consegui fazê-la funcionar corretamente.

Obrigado!

sql-server
  • 3 respostas
  • 575 Views
Martin Hope
Joe Obbish
Asked: 2024-03-13 03:53:24 +0800 CST

Como posso evitar que o SQL Server registre o início e a interrupção das sessões XE nos arquivos de log do servidor?

  • 8

Eu tenho um processo que inicia e interrompe sessões de eventos estendidos para transferir dados de arquivos de eventos para tabelas SQL. Em um servidor SQL Server 2022 RTM, vejo muitas linhas gravadas nos arquivos de log por este processo:

insira a descrição da imagem aqui

Gostaria que o início e a interrupção das sessões XE não fossem gravados no arquivo de log porque meus arquivos de log agora estão esmagadoramente preenchidos com essas entradas. Esse comportamento não ocorre em uma instância do Microsoft SQL Server 2019 (RTM-CU22-GDR).

Como posso evitar que o SQL Server registre o início e a interrupção das sessões XE nos arquivos de log do servidor?

sql-server
  • 1 respostas
  • 53 Views
Martin Hope
Roberto Iglesias
Asked: 2024-03-13 02:25:38 +0800 CST

Dificuldade em implementar algum tipo de compatibilidade retroativa no PostgreSQL

  • 6

Estou enfrentando um problema ao implementar uma regra ou gatilho no PostgreSQL para lidar com inserções em uma tabela onde um dos tipos de coluna ( a) foi alterado e consultas antigas. Tentei algumas abordagens, mas não consegui alcançar o comportamento desejado.

Aqui está uma versão simplificada do meu cenário:

Eu tenho uma tabela t1com colunas ae b:

CREATE TABLE t1 (
    a int,
    b int
);

Quero permitir consultas que venham com outro tipo para column a, como uma string, e substituí-lo por outro valor, digamos 0. No entanto, se um valor inteiro for inserido, ele deverá ser preservado sem modificação.

Tentei usar uma regra e uma função de gatilho, mas estou encontrando problemas com cada abordagem:

  1. Regra : tentei criar uma regra para interceptar inserções e modificar o valor da coluna ase não for um número inteiro. No entanto, enfrentei problemas com recursão infinita e a regra não sendo acionada para entradas inválidas:
CREATE RULE test_rule AS
    ON INSERT TO t1
    WHERE pg_typeof(NEW.a) <> 'integer'::regtype
    DO INSTEAD
        INSERT INTO t1 (a, b)
        VALUES (0, NEW.b)
postgres=# insert into t1 (select 'x',1);
ERROR:  invalid input syntax for type integer: "x"
LINE 1: insert into t1 (select 'x',1);
                               ^
postgres=# insert into t1 (select 1,1);
ERROR:  infinite recursion detected in rules for relation "t1"
  1. Função de gatilho : tentei usar uma função de gatilho para verificar o tipo de dados do valor inserido e modificá-lo de acordo. Embora essa abordagem funcionasse para entradas válidas, ela não tratava entradas inválidas conforme o esperado.
CREATE OR REPLACE FUNCTION insert_default_a_if_non_integer()
RETURNS TRIGGER AS
$$
BEGIN
    IF pg_typeof(NEW.a) <> 'integer'::regtype THEN
        NEW.a := 0;  -- or any default value you prefer
    END IF;
    RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER t1_insert_trigger
BEFORE INSERT ON t1
FOR EACH ROW
EXECUTE FUNCTION insert_default_a_if_non_integer();
postgres=# insert into t1 (select 1,1);
INSERT 0 1
postgres=# insert into t1 (select 'x',1);
ERROR:  invalid input syntax for type integer: "x"
LINE 1: insert into t1 (select 'x',1);
                               ^

Alguém poderia fornecer orientação sobre a melhor abordagem para atender às minhas necessidades? Quaisquer insights ou soluções alternativas seriam muito apreciadas.

Obrigado!

postgresql
  • 1 respostas
  • 23 Views
Martin Hope
LonelyDBA92
Asked: 2024-03-12 21:20:44 +0800 CST

Consulta de metadados lenta em um banco de dados específico

  • 5

Eu tenho um problema bastante estranho (quem não tem). Nosso software ETL verifica bancos de dados de origem para reivindicar dados de objetos. Extrai informações de INFORMATION_SCHEMA sobre objetos (tabelas e visualizações)

SELECT
t.[TABLE_SCHEMA],
t.[TABLE_NAME],
c.[COLUMN_NAME],
c.[DATA_TYPE],
c.[CHARACTER_MAXIMUM_LENGTH],
c.[NUMERIC_PRECISION],
c.[NUMERIC_SCALE],
c.[DATETIME_PRECISION],
c.[ORDINAL_POSITION],
c.[IS_NULLABLE],
prim.[CONSTRAINT_NAME] AS [PRIMARY_KEY_NAME],
t.[TABLE_TYPE]
FROM [INFORMATION_SCHEMA].[TABLES] t
INNER JOIN [INFORMATION_SCHEMA].[COLUMNS] c
ON t.[TABLE_CATALOG] = c.[TABLE_CATALOG]
AND t.[TABLE_SCHEMA] = c.[TABLE_SCHEMA]
AND t.[TABLE_NAME] = c.[TABLE_NAME]
LEFT OUTER JOIN (
SELECT tc.[CONSTRAINT_NAME], tc.[CONSTRAINT_SCHEMA], tc.[CONSTRAINT_CATALOG], cc.[TABLE_NAME], cc.[COLUMN_NAME]
FROM [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] tc
INNER JOIN [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] cc
ON tc.[CONSTRAINT_NAME] = cc.[CONSTRAINT_NAME]
AND tc.[CONSTRAINT_SCHEMA] = cc.[CONSTRAINT_SCHEMA]
AND tc.[CONSTRAINT_CATALOG] = cc.[CONSTRAINT_CATALOG]
AND tc.[TABLE_NAME] = cc.[TABLE_NAME]
AND tc.[TABLE_CATALOG] = cc.[TABLE_CATALOG]
AND tc.[TABLE_SCHEMA] = cc.[TABLE_SCHEMA]
WHERE tc.[CONSTRAINT_TYPE] = 'PRIMARY KEY') prim
ON t.[TABLE_CATALOG] = prim.[CONSTRAINT_CATALOG]
AND t.[TABLE_SCHEMA] = prim.[CONSTRAINT_SCHEMA]
AND t.[TABLE_NAME] = prim.[TABLE_NAME]
AND c.[COLUMN_NAME] = prim.[COLUMN_NAME]
ORDER BY t.[TABLE_SCHEMA], t.[TABLE_NAME], c.[ORDINAL_POSITION]

Para a maioria dos bancos de dados (dependendo da quantidade de objetos e colunas), isso leva um minuto para ser concluído. Para um banco de dados específico, isso leva de 10 a 35 minutos! Não consigo entender o porquê. Não posso alterar a consulta acima (já que está incorporada no software), então estou procurando uma maneira de melhorar o desempenho neste banco de dados

A consulta gera aproximadamente a mesma quantidade de registros. Verifiquei a configuração do banco de dados e são exatamente iguais. Quando testei com 'SET STATISTICS IO ON', ficou claro que havia muita coisa acontecendo no banco de dados de menor desempenho do que nos outros bancos de dados. Coloquei em www.statisticsparser.com e é assim que parece para os de menor desempenho: estatísticas analisadas em banco de dados inválido Para comparação, é assim que parece um banco de dados normal: estatísticas analisadas bom banco de dados

Eu mesmo estou sem opção. Tentei limpar o proc e o cache do sistema (com o DBCC correspondente) e atualizar as estatísticas de todo o banco de dados, mas (como esperado) não adiantou.

Qualquer ajuda é apreciada!

Atenciosamente

EDIT: adicionei os planos de consulta para comparar com um banco de dados com aproximadamente o mesmo tamanho e estrutura no mesmo servidor (que não tem problema de desempenho: https://file.io/ODajcfrzvGTP

Contém 2 arquivos: _fast é do banco de dados sem problemas _slow é do banco de dados com problemas

sql-server
  • 1 respostas
  • 60 Views
Martin Hope
Marcello Miorelli
Asked: 2024-03-12 18:41:22 +0800 CST

banco de dados envolvido no grupo de disponibilidade - mostrando o estado como online, mas está sincronizando e não aceita conexão - como posso descobrir isso?

  • 5

como posso encontrar a lista de bancos de dados aos quais posso realmente me conectar?

Estou usando sys.master_files para verificar o estado dos arquivos do meu banco de dados, porém, no secundário, o banco de dados está sincronizando e aparece como ONLINE

Eu não posso fazer isto:

use my_database

e não posso fazer isso:

select * from my_database.sys.master_files

Msg 976, Nível 14, Estado 1, Linha 364 O banco de dados de destino, 'my_database', está participando de um grupo de disponibilidade e atualmente não está acessível para consultas. A movimentação de dados está suspensa ou a réplica de disponibilidade não está habilitada para acesso de leitura. Para permitir acesso somente leitura a este e outros bancos de dados no grupo de disponibilidade, habilite o acesso de leitura a uma ou mais réplicas de disponibilidade secundárias no grupo. Para obter mais informações, consulte a instrução ALTER AVAILABILITY GROUP nos Manuais Online do SQL Server.

sql-server
  • 2 respostas
  • 27 Views
Martin Hope
olleicua
Asked: 2024-03-11 22:49:14 +0800 CST

Otimize o desempenho da consulta para um filtro em col_a > col_b

  • 7

Eu tenho uma tabela grande em um banco de dados PostgreSQL (cerca de 100 colunas, milhões de linhas). Minha consulta não possui junções, mas possui várias cláusulas where. Todas as cláusulas where são cobertas por índices apropriados, exceto aquele que possui a forma WHERE table.col_a > table.col_b. Minha dúvida é: se eu fizer um índice de table(col_a, col_b)vontade que otimize a operação maior ou preciso fazer algo específico para tornar isso eficiente?


EDIT: Adicionando consulta/explicação/ddl anonimizada por comentário de @frank-heikens.

Percebi na revisão que col_fnão possui um índice e suspeito que adicioná-lo resolveria grande parte do meu problema. Dito isto, ainda gostaria de saber a melhor maneira de otimizar para table.col_b < table.col_a.

Se ajudar, col_bquase sempre é 0,0 e col_aé sempre positivo. Meu palpite é que isso reduz o benefício de desempenho porque relativamente poucas linhas são filtradas por esta cláusula. Qualquer conselho sobre o custo/benefício relativo de um índice de múltiplas colunas ou índice de expressão seria bem-vindo.

Consulta:

explain(analyze, verbose, buffers, settings)
SELECT id, col_a, col_b, col_c, col_d, col_e
FROM  public.table
WHERE col_f = 'VALUE' AND
      col_g != 'EXCLUDED_VALUE' AND
      col_b < col_a AND
      NOT ((col_h 'EXCLUDED_VALUE_1', 'EXCLUDED_VALUE_2') OR
           col_h IS NULL)) AND
      col_e IS NOT NULL
ORDER BY col_e DESC
LIMIT 5;
                                                     QUERY PLAN                                                                                                                                                                                              
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=10.61..10.62 rows=1 width=73) (actual time=0.101..0.102 rows=1 loops=1)
   Output: id, col_a, col_b, col_c, col_d, col_e
   Buffers: shared hit=2
   ->  Sort  (cost=10.61..10.62 rows=1 width=73) (actual time=0.100..0.100 rows=1 loops=1)
         Output: id, col_a, col_b, col_c, col_d, col_e
         Sort Key: table.col_e DESC
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=2
         ->  Seq Scan on public.table  (cost=0.00..10.60 rows=1 width=73) (actual time=0.046..0.083 rows=1 loops=1)
               Output: id, col_a, col_b, col_c, col_d, col_e
               Filter: ((table.col_h IS NOT NULL) AND (table.col_e IS NOT NULL) AND ((table.col_g)::text <> 'EXCLUDED_VALUE'::text) AND (table.col_b < table.col_a) AND ((table.col_h)::text <> ALL ('{EXCLUDED_VALUE_1,EXCLUDED_VALUE_2}'::text[])) AND ((table.col_f)::text = 'VALUE'::text))
               Rows Removed by Filter: 10
               Buffers: shared hit=2
 Planning Time: 0.467 ms
 Execution Time: 0.149 ms
(15 rows)

DDL:

-- Dumped from database version 14.10 (Homebrew)

CREATE TABLE public.table (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    col_a double precision,
    col_b double precision,
    col_c boolean,
    col_d character varying,
    col_e timestamp(6) without time zone,
    col_f character varying,
    col_g character varying,
    col_h character varying,
    -- columns not referenced in the query have been elided
);

ALTER TABLE ONLY public.table
    ADD CONSTRAINT table_pkey PRIMARY KEY (id);

CREATE INDEX index_table_on_col_e ON public.table USING btree (col_e);
CREATE INDEX index_table_on_col_g ON public.table USING btree (col_g);
CREATE INDEX index_table_on_col_h ON public.table USING btree (col_h);

-- indexes for columns not referenced in the query have been elided
postgresql
  • 2 respostas
  • 264 Views
Martin Hope
Ivaylo
Asked: 2024-03-11 18:34:18 +0800 CST

Índice composto com uma coluna de intervalo no meio

  • 7

Meu entendimento é que ao projetar um índice composto, uma coluna que será usada para testes de intervalo deve ser colocada no final desse índice, porque o uso das colunas em índices compostos para após a primeira coluna de intervalo.

O que EXPLAINacontece é que também uma coluna após uma coluna de intervalo é usada pelo otimizador. É por isso que estou confuso e não tenho certeza de como projetar corretamente meus índices compostos.

Abaixo está um exemplo simplificado da minha tabela. Para cada data DatePhá um número de objetos Object. Cada um Objecttem 3 subobjetos subjacentes subObject. subObjecté um nome exclusivo para cada um DatePe é derivado Objectda adição de um número. subObjectpossui um identificador inteiro subObjectId, que geralmente é 0, 1 ou 2 e é único dentro do mesmo Object.

subobjeto Objeto DataP subObjectId contador1
aaa1 aaa 01/06/2019 0 10
aaa2 aaa 01/06/2019 1 13
aaa3 aaa 01/06/2019 2 11
bbb1 bbb 01/06/2019 0 9
bbb2 bbb 01/06/2019 1 6
bbb3 bbb 01/06/2019 2 7
aaa1 aaa 02/06/2019 0 14
aaa2 aaa 02/06/2019 1 12
aaa3 aaa 02/06/2019 2 16

CREATE TABLEo código está abaixo. O mecanismo de tabela é MyISAM e o servidor é MySQL 8.

CREATE TABLE `testTab` (
  `DateP` date NOT NULL,
  `Object` char(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `subObject` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `subObjectId` int NOT NULL,
  `counter1` int DEFAULT NULL,
  ......
  PRIMARY KEY (`subObject`,`DateP`,`subObjectId`) USING BTREE,
  KEY `Object` (`Object`,`DateP`,`subObjectId`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC 

A coluna mais exclusiva de é KEY, Objectseguida por DateP. O menos exclusivo é subObjectId. Pelo que eu sei, a exclusividade das colunas também é importante para sua ordem em um índice composto - a mais exclusiva deve estar na posição mais à esquerda.

A seguir você pode ver diferentes versões EXPLAINdependendo das condições da WHEREcláusula.

  1. Todas as três colunas do índice composto são apresentadas. No meio está o teste de intervalo de DateP. No entanto, subObjectIda coluna também é usada pelo Optimizer após o teste de alcance. key_lené 31 .
EXPLAIN SELECT DateP,Object,SUM(counter1)
FROM testTab
WHERE Object='aaa' AND DateP>='2019-06-01' AND DateP<='2019-06-10' AND (subObjectId=0 OR subObjectId=1)
GROUP BY Object,DateP
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
| id | select_type | table   | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | testTab | NULL       | range | Object        | Object | 31      | NULL |   28 |    19.00 | Using index condition |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
  1. A primeira e a segunda colunas são apresentadas na WHEREcláusula, finalizando com o teste de intervalo. key_lené 27 .
EXPLAIN SELECT DateP,Object,SUM(counter1)
FROM testTab
WHERE Object='aaa' AND DateP>='2019-06-01' AND DateP<='2019-06-10'
GROUP BY Object,DateP
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
| id | select_type | table   | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | testTab | NULL       | range | Object        | Object | 27      | NULL |   29 |   100.00 | Using index condition |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+-----------------------+
  1. Apenas a primeira coluna é usada em WHERE. key_lené 24 .
EXPLAIN SELECT DateP,Object,SUM(counter1)
FROM testTab
WHERE Object='aaa' 
GROUP BY Object,DateP
+----+-------------+---------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+
| id | select_type | table   | partitions | type | possible_keys | key    | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+---------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | testTab | NULL       | ref  | Object        | Object | 24      | const |  417 |   100.00 | Using index condition |
+----+-------------+---------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+

Minha conclusão é que todas as três colunas do índice composto podem ser usadas, apesar de no meio haver uma coluna para testes de intervalo. Mas posso esperar que o otimizador sempre respeite a terceira coluna?

No meu design atual KEYé desenhado com DatePcoluna no final.

KEY `Object` (`Object`,`subObjectId`,`DateP`) USING BTREE

Mas esta ordem não é adequada para GROUP BYcláusula, que é:

GROUP BY Object,DateP

Neste caso, para agrupamento, acho que apenas Objecta coluna é usada, porque pulo a coluna do meio DateP. A execução da consulta termina com Using temporary.

+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+----------------------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra                                  |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+----------------------------------------+
|  1 | SIMPLE      | testTab | NULL       | range | Object        | Object | 31      | NULL |   20 |   100.00 | Using index condition; Using temporary |
+----+-------------+---------+------------+-------+---------------+--------+---------+------+------+----------+----------------------------------------+
mysql
  • 1 respostas
  • 51 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