SELECT FULL TABLE SCAN?

 Tópico anterior Próximo tópico Novo tópico

SELECT FULL TABLE SCAN?

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#493205 - 24/03/2020 08:02:13

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Fala galera tranquilo? quanto tempo hein..

Estou com um problema, tenho na minha aplicao um Select que ta dando Full Table Scan e ta lascando o processamento do meu banco de dados no Amazon RDS.
gostaria de saber alguma alternativa j que eu no posso alterar ele, eu tomei algumas medidas que deu uma melhorada mas mesmo assim da um pico grande de processamento
quando executa ele e o negcio ta ficando feio..

O que eu fiz: joguei uma variavel com o nome da tabela e separei registros de 2017,2018,2019 e 2020 assim ele da um FullScan numa tabela com menos registros possiveis
(mesmo assim sao em media +50 mil Rows ano)..

Resolveu em partes, porm teria alguma outra forma de eu resolver isso sem mexer nesse Select ??

Citação:
sql = []SELECT CONCAT(os.codigo,os.mes,os.ano),os.Rev,DATE(os.data) AS []Data de Entrada[],orc.dias AS []Prev. Finalizao[],os.orcamento,os.item AS []ITEM INVI[],os.`item` AS Item,orc.cliente AS []Solicitante[],orc.solicitante AS []Interessado[],ite.codigoensaio AS []Codigo do Ensaio[],os.impresso,os.Enviado,lb.DataEnviado AS []Data de Envio[],orc.codigo,orc.Mes,orc.Ano,orc.CodCli,orc.CodSol,os.realizado,lb.DataFinalizacao AS []Data de Finalizao[],ite.NormaOs AS []Norma[],lb.DataPrevLab AS []Prev. do Lab.[],lb.RespPrevLab,os.codigo seqos,os.mes mesos,os.ano anoos,os.Situacao,lb.DataSaidaAmReceb AS []Sada do Recebimento[],lb.RespSaidaAmReceb,lb.DataEntradaLaboratorio AS []Entrada da Am. no Laboratrio[],lb.RespEntrada as RespEntradaAmLab,lb.Andamento STATUS,lb.Status Status2, lb.Laboratorio,lb.DataInicio,lb.DataTermino,lb.RespFinalizacao,lb.RespEnsaio,ite.ProdEnsaiado,CONCAT(ROUND(ite.QtdItem,2),[] [],ite.UnidItem) as []Qtd[],lb.Tipo,lb.Categoria,ck.TipoEnsaio as []Ensaio[],lb.PrazoPCP as []Prazo do PCP[],lb.ObsPCP,ck.Pendencia,ck.Resolvida,ck.OS as checklist,lb.IPEM as IPEM,orc.subcontratado,lb.subcontratado as subcontratacao,lb.Data_Subcontratacao,lb.DataFin_Coleta AS []Finalizao da Coleta[],lb.RespFin_Coleta AS []Responsvel Fin. Coleta[][] &
                      [] FROM ordemservicocotacao_hc_copylab orc [] &
                      [] INNER JOIN ordemservicocotacaoitem_hc_copylab ite ON orc.`codigo`=ite.`Numero` AND orc.`mes`=ite.mes AND orc.ano=ite.`Ano`[] &
                      [] INNER JOIN  [] & Param_Ordemservico_copylab & [] os ON  os.seqorc=ite.Numero AND os.`mesorc`=ite.Mes AND os.`anoorc` = ite.Ano AND os.item=ite.item[] &
                      [] LEFT JOIN  [] & Param_Ordemservico_laboratorio & [] lb ON os.`codigo` = lb.seq AND os.mes = lb.mes AND os.ano = lb.ano[] &
                      [] LEFT JOIN  [] & Param_Check_list_os & [] ck ON ck.OS=lb.OS AND ck.Laboratorio=lb.Laboratorio[]


No painel de Performance da Amazon ele me fala:
calls/sec:0.02
avg latency (ms)/call:3047.16
rows examined/call:2174697.73

Abraos galera..

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


#493212 - 24/03/2020 12:31:05

ROGERIOLIMAB
RIO DE JANEIRO
Cadast. em:Março/2020


Fala Mestre, boa tarde,
Se todos as relaes da sua query estiverem corretas, no h motivos para esta query, que no complexa, dar FULL TABLE SCAN.
Minhas sugestes:
1) Reveja os relacionamentos entre as tabelas num cenrio, por exemplo de somente 10 clientes, e confirme se no existem dados repetidos por falta de relaes entre campos.
2) Neste contexto, no importa muito o que a query vai retornar de campos, e sim, se a quantidade de registros. Desta forma, v executando a query adicionando tabela a tabela, at chegar ao FULL TABLE SCAN e, a princpio, saber em qual relacionamento esta ocorrendo o problema.

Espero ter ajudado,

Abraos,

Rogerio
  

Abs,
Rogerio de Lima

#493213 - 24/03/2020 12:54:16

LVFIOROT
SERRA
Cadast. em:Março/2012


At onde tenho conhecimento, para evitar o full scan, precisar criar ndices com pelo menos com as condies que so fixas da where (geralmente data, empresa, equipamento, etc....)




#493220 - 24/03/2020 18:16:54

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Citação:
:
Fala Mestre, boa tarde,
Se todos as relaes da sua query estiverem corretas, no h motivos para esta query, que no complexa, dar FULL TABLE SCAN.
Minhas sugestes:
1) Reveja os relacionamentos entre as tabelas num cenrio, por exemplo de somente 10 clientes, e confirme se no existem dados repetidos por falta de relaes entre campos.
2) Neste contexto, no importa muito o que a query vai retornar de campos, e sim, se a quantidade de registros. Desta forma, v executando a query adicionando tabela a tabela, at chegar ao FULL TABLE SCAN e, a princpio, saber em qual relacionamento esta ocorrendo o problema.

Espero ter ajudado,

Abraos,

Rogerio
  

Vou seguir sua dica!! e tentar obrigado!!

Citação:
:
At onde tenho conhecimento, para evitar o full scan, precisar criar ndices com pelo menos com as condies que so fixas da where (geralmente data, empresa, equipamento, etc....)

Ento como cria indices corretamente eu ate cheguei a criar alguns indices porem sem sucesso..

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


#493229 - 25/03/2020 09:23:24

LVFIOROT
SERRA
Cadast. em:Março/2012


Os campos que esto no inner/left join precisam estar com indices criados tambem.
Outro problema pode ser o left, pois mesmo se nao tiver o resultado, ser processado os registros da []Esquerda[]



Resposta escolhida #493231 - 25/03/2020 18:17:23

WEBMASTER
CURITIBA
Cadast. em:Janeiro/2001


Membro da equipe
Teoricamente teu problema esta nas ligaes (joins) das tabelas.
Uma coisa que ajuda  pra @#@#$!#@ uma coisa muito besta, mas quando a gente aprende a dar valor nela...nossa senhora.
D um explain no teu sql

De:
select * from a inner join b on a.campo = b.campo

Para:
explain select * from a inner join b on a.campo = b.campo


Eu mesmo ja achei cada M por causa de conexoes mal feitas ou mesmo campos que estavam no where, e que nao eram necessarios, caindo por exemplo de 11segundos de payload para 0.11ms de payload.
Use o explain, ele teu amigo, teu chapa, teu camarada , mas fala haramaico, entao o problema e entender []como[] ele fala, depois que voce entende tudo fica facil.

WebMaster - VBMania

Nao me mande e-mail com duvidas
Para isso e que existe o forum do VBMania !!!

#493838 - 14/05/2020 17:36:59

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Última edição em 14/05/2020 17:45:22 por MESTRE

Citação:
:
Teoricamente teu problema esta nas ligaes (joins) das tabelas.
Uma coisa que ajuda  pra @#@#$!#@ uma coisa muito besta, mas quando a gente aprende a dar valor nela...nossa senhora.
D um explain no teu sql

De:
select * from a inner join b on a.campo = b.campo

Para:
explain select * from a inner join b on a.campo = b.campo


Eu mesmo ja achei cada M por causa de conexoes mal feitas ou mesmo campos que estavam no where, e que nao eram necessarios, caindo por exemplo de 11segundos de payload para 0.11ms de payload.
Use o explain, ele teu amigo, teu chapa, teu camarada , mas fala haramaico, entao o problema e entender []como[] ele fala, depois que voce entende tudo fica facil.


WEBMASTER, Galera o problema persiste... eu tenho uma tabela chamada []ordemservico_laboratorio[]

Segue o explain da consulta:  
  id  select_type  table   type    possible_keys  key      key_len  ref                                                                          rows  Extra                                        
------  -----------  ------  ------  -------------  -------  -------  -------------------------------------------------------------------------  ------  ----------------------------------------------
     1  SIMPLE       lb      ALL     PRIMARY        (NULL)   (NULL)   (NULL)                                                                      14423  Using where; Using temporary; Using filesort  
     1  SIMPLE       os      ref     PRIMARY        PRIMARY  26       labdados.lb.ano,labdados.lb.mes,labdados.lb.seq                                23  Using where                                  
     1  SIMPLE       ite     eq_ref  PRIMARY        PRIMARY  44       labdados.os.seqorc,labdados.os.mesorc,labdados.os.anoorc,labdados.os.item       1  Using where                                  
     1  SIMPLE       orc     ref     PRIMARY        PRIMARY  8        labdados.ite.Mes                                                              200  Using where                                  

minha Query:
  SELECT lb.Orcamento,ite.Item,lb.OS,orc.numprocesso AS []N de Processo[],lb.Laboratorio,lb.Andamento,DATE(os.data) AS []Data de Entrada da OS[],orc.dias AS []Prev. Finalizao de Vendas[],DATE(lb.DataDirecionamento) AS []Entrada da OS no Lab.[],DATE(lb.DataSaidaAmReceb) AS []Sada da Am. do Recebimento[],DATE(lb.DataEntradaLaboratorio) AS []Entrada da Am. no Laboratrio[],DATE(ADDDATE(lb.DataPrevLab, INTERVAL 3 DAY)) AS []Previso de Trmino dos Ensaios[],DATE(lb.DataInicio) AS []Incio dos Ensaios[],DATE(lb.DataTermino) AS []Trmino dos Ensaios[],DATE(lb.DataFinalizacao) AS []Finalizao da OS[],DATE(lb.DataEnviado) AS []Data de Envio do Relatrio[],os.Situacao,orc.cliente Solicitante,orc.Solicitante Interessado,lb.RespEnsaio,lb.RespEnviado,lb.Data_Subcontratacao,ite.Normaos
FROM `ordemservicocotacao_hc_copylab` orc
INNER JOIN `ordemservicocotacaoitem_hc_copylab` ite ON orc.codigo=ite.numero AND orc.mes=ite.mes AND orc.ano=ite.ano
INNER JOIN `ordemservico_copylab` os ON ite.numero=os.seqorc AND ite.mes=os.mesorc AND ite.ano=os.anoorc AND ite.item=os.item
INNER JOIN `ordemservico_laboratorio` lb ON os.codigo=lb.seq AND os.mes=lb.mes AND os.ano=lb.ano
WHERE DATE(lb.DataFinalizacao) BETWEEN []2020-05-01[] AND []2020-05-14[] ORDER BY os.codigo, os.mes, os.ano, lb.laboratorio;
  


Como voce pode observar eu uso um Between pra pesquisar somente coisas do dia 01-05-2020 ate 14-05-2020, o que nao explicaria um full table scan? correto? ele me retorna 14 mil registros
sendo que desses 14 mil apenas alguns sao do range desse periodo...

Caso eu de um select simples:
SELECT * FROM ordemservico_laboratorio WHERE DATE(DataFinalizacao) BETWEEN []2020-05-01[] AND []2020-05-14[];

me retornado 1.100 linhas que so os resultados dentro do Range e a resposta fica em 0.028s ao inves de 6 min 20s igual do full table scan..  

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MESTRE em 12/05/2021 16:01:56