|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
7master Novato
Registrado: Domingo, 9 de Setembro de 2012 Mensagens: 14
|
Enviada: Seg Jul 23, 2018 4:25 pm Assunto: Select tabela com 492.792 registros lenta |
|
|
Olá pessoa, tudo bem?
Me deparei com um problema de performance em um BD com Firebird 2.5 que atingiu uma quantidade de registros que eu não esperava.
Tenho uma tabela de estoque onde registro todas as movimentações do produto. Essa tabela hoje está com 492.792 registros e a consulta com sumarização ficou muito lenta, levando até 2 min. Já criei índices ascendentes e descendentes, mas melhorou muito pouco.
Vou precisar lista o estoque por mês durante um ano específico.
Ex: JAN FEV MAR ABR MAI...
1000 525 458 855 255
Fiz um select simples e o mesmo demora muito.
[code=sql]
select prod_id,
(select first 1 estoq_atual from estoque where
ano = :ano and estoque.prod_id = produtos.prod_id order by estoq_id desc) as estoque
from produtos order by prod_id
[/code]
Resultado Local
Citação: |
Adapted Plan
PLAN (ESTOQUE ORDER ESTOQUE_IDX7 INDEX (ESTOQUE_IDX3, ESTOQUE_IDX1)) PLAN (PRODUTOS ORDER PK_PRODUTOS)
------ Performance info ------
Prepare time = 15ms
Execute time = 44s 695ms
Avg fetch time = 3.724,58 ms
Current memory = 2.493.468
Max memory = 2.664.676
Memory buffers = 384
Reads from disk to cache = 591.568
Writes from cache to disk = 0
Fetches from cache = 868.070
|
Estrutura da Tabela
[code=sql]
CREATE TABLE ESTOQUE (
ESTOQ_ID INTEGER NOT NULL PRIMARY KEY,
PROD_ID INTEGER,
ESTOQ_DATA TIMESTAMP,
ESTOQ_ORIGEM VARCHAR(40),
ESTOQ_ANTERIOR NUMERIC(5,3) DEFAULT 0,
ESTOQ_ENTRADA NUMERIC(5,3) DEFAULT 0,
ESTOQ_SAIDA NUMERIC(5,3) DEFAULT 0,
ESTOQ_MIN NUMERIC(5,3) DEFAULT 0,
ESTOQ_MAX NUMERIC(5,3) DEFAULT 0,
ESTOQ_ATUAL COMPUTED BY (ESTOQ_ANTERIOR +ESTOQ_ENTRADA - ESTOQ_SAIDA),
USU_ID INTEGER,
ESTOQ_VENCIDOS NUMERIC(5,3) DEFAULT 0,
ESTOQ_AVARIA NUMERIC(5,3) DEFAULT 0,
ESTOQ_NFE NUMERIC(5,3) DEFAULT 0,
ESTOQ_REAL COMPUTED BY ((ESTOQ_AVARIA - ESTOQ_VENCIDOS) - ESTOQ_ATUAL),
LOJ_ID INTEGER,
ESTOQ_ACAO VARCHAR(60) COLLATE WIN_PTBR,
CUSTO NUMERIC(12,2) DEFAULT 0 ,
ESTOQ_DATE DATE,
ANO INTEGER,
MES INTEGER,
DIA INTEGER
);
[/code]
Alguém pode me dar um dica de como posso melhorar a performance?
Desde já agradeço. |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Jul 24, 2018 9:58 am Assunto: |
|
|
Bom dia,
Não sei se vou conseguir ajudar, mas você pode postar a composição dos índices existentes na tabela Estoque quando você executou a consulta e obteve aquele plano de execução?
Você pretende utilizar uma subquery para cada mes, adicionando também um filtro para o mes?
O campo Estoq_Date tem o mesmo conteúdo dos campos Ano, Mes e Dia? Se sim, pode existir mais de um registro com a mesma data?
_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|