[firebase-br] Leitura lenta de uma tabela
José Mauricio Barbisan Zottis
zottissistemas em gmail.com
Quinta Fevereiro 18 16:04:59 -03 2021
Descobri o problema, tinha uma outra função que deixava lento o processo.
PS: tirei todos os subselects e as Functions também, deixei somente o SQL
puro e criei o indice
ajudou a deixar mais rápido.
Muitíssimo obrigado
Em qui., 18 de fev. de 2021 às 15:18, Frederico Godoi <
frederico.godoi em gmail.com> escreveu:
> Data está DENTRO de um índice Unique que contém vários outros campos;
> Se sua SQL está usando apenas um dos campos ele não usar;
> Se a sua consulta é recorrente ( como você disse ) então o ideal é criar
> um índice específico pra sua consulta;
> Porém índices separados ( um para cada campo ) as vezes é melhor que
> índice composto;
> Como você já tem um índice para pessoa ( FK ) cria um novo índice para
> data e vai estar com a sua pesquisa toda indexada;
>
> *remova o sub-select e faça um join*
>
> On Thu, 18 Feb 2021 at 15:15, José Mauricio Barbisan Zottis <
> zottissistemas em gmail.com> wrote:
>
>> a data tem no indice UNIQUE, o FB não usa?
>>
>> Em qui., 18 de fev. de 2021 às 14:43, Frederico Godoi <
>> frederico.godoi em gmail.com> escreveu:
>>
>>> Tem o índice pra Pessoa mas não tem pra coluna de Data, cria e faz um
>>> teste de performance;
>>> E tira aquele sub-select e faz um join;
>>>
>>>
>>> On Thu, 18 Feb 2021 at 14:41, José Mauricio Barbisan Zottis <
>>> zottissistemas em gmail.com> wrote:
>>>
>>>> Em qui., 18 de fev. de 2021 às 14:40, José Mauricio Barbisan Zottis <
>>>> zottissistemas em gmail.com> escreveu:
>>>>
>>>>> mas os campos FK já não são índices?
>>>>>
>>>>>
>>>>> Em qui., 18 de fev. de 2021 às 14:20, Frederico Godoi <
>>>>> frederico.godoi em gmail.com> escreveu:
>>>>>
>>>>>> Entendi que não existe índice;
>>>>>> Cria um índice para cada coluna ( cd_pessoaref , dt_dia )
>>>>>> Altera esse sub-select do nome da pessoa para um INNER JOIN;
>>>>>> Faça o teste na ferramenta de banco direta com fetch all e veja o
>>>>>> tempo;
>>>>>>
>>>>>> abs
>>>>>> Frederico
>>>>>>
>>>>>> On Thu, 18 Feb 2021 at 14:05, José Mauricio Barbisan Zottis <
>>>>>> zottissistemas em gmail.com> wrote:
>>>>>>
>>>>>>> Plano
>>>>>>> PLAN (P INDEX (PK_REF_PESSOAS))
>>>>>>> PLAN (C INDEX (FK_REF_DIA_PESREF))
>>>>>>>
>>>>>>> select c.cd_codigo,
>>>>>>> c.cd_mes,
>>>>>>> c.cd_empresa,
>>>>>>> f_nmempresa(c.cd_empresa) nm_empresa,
>>>>>>> c.cd_fornecedor,
>>>>>>> f_nmpessoa(c.cd_fornecedor)nm_fornecedor,
>>>>>>>
>>>>>>> c.cd_pessoaref,
>>>>>>> (select p.nm_usuario from ref_pessoas p where p.cd_codigo =
>>>>>>> c.cd_pessoaref)nm_pessoaref,
>>>>>>> c.dt_dia,
>>>>>>> c.qt_quantidade,
>>>>>>> c.vl_unitario,
>>>>>>> c.vl_total,
>>>>>>> c.vl_fornecedor,
>>>>>>> c.vl_totfornec,
>>>>>>> c.cd_ccusto,
>>>>>>>
>>>>>>> ------------------
>>>>>>> c.dt_cadastro,
>>>>>>> c.cd_usuario,
>>>>>>> c.cd_editor,
>>>>>>> c.dt_atualizacao,
>>>>>>> c.hr_atualizacao,
>>>>>>> f_nmusuario(c.cd_usuario)ds_usuario,
>>>>>>> f_nmusuario(c.cd_editor)ds_editor
>>>>>>> from ref_dia c
>>>>>>> where c.cd_pessoaref = :varCdPessoaRef
>>>>>>> and c.dt_dia = :varDia
>>>>>>>
>>>>>>>
>>>>>>> Em qui., 18 de fev. de 2021 às 12:23, Frederico Godoi via lista <
>>>>>>> lista em firebase.com.br> escreveu:
>>>>>>>
>>>>>>>> Coloca o SQL e o plano que a gente pode ajudar melhor;
>>>>>>>>
>>>>>>>> On Thu, 18 Feb 2021 at 09:56, José Mauricio Barbisan Zottis via
>>>>>>>> lista <
>>>>>>>> lista em firebase.com.br> wrote:
>>>>>>>>
>>>>>>>> > Pessoal, bom dia.
>>>>>>>> >
>>>>>>>> > tenho um controle de refeições que é feito dentro de um
>>>>>>>> determinado
>>>>>>>> > período.
>>>>>>>> > Faço um loop na tabela de usuários das refeições e verifico se
>>>>>>>> ele é
>>>>>>>> > fixo(come todos os dias) ou variável(de vez em quando).
>>>>>>>> > carrego tudo em um StringGrig
>>>>>>>> > o Que acontece é que a tabela de Dias, para cada usuário dentro
>>>>>>>> do período
>>>>>>>> > é de no máximo 21 dias, e para montar a grade está levando muito
>>>>>>>> tempo.
>>>>>>>> >
>>>>>>>> > para cada usuário leva 5 segundos para ler os 21 dias, isso é
>>>>>>>> normal?
>>>>>>>> >
>>>>>>>> > Alguém teria uma Dica? Desde já agradeço.
>>>>>>>> > Uso o FB 3.0/Delphi 10.4(Sidney) e Firedac
>>>>>>>> >
>>>>>>>> > a tabela, acredito que está modelada de acordo.
>>>>>>>> > CREATE GENERATOR GEN_REF_DIA_ID;
>>>>>>>> >
>>>>>>>> > CREATE TABLE REF_DIA (
>>>>>>>> > CD_CODIGO PK NOT NULL /* PK = INTEGER NOT NULL */,
>>>>>>>> > CD_EMPRESA PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > CD_MES PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > CD_FORNECEDOR PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > CD_PESSOAREF PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > DT_DIA DATAS /* DATAS = DATE NOT NULL */,
>>>>>>>> > QT_QUANTIDADE QUANTIA /* QUANTIA = DOUBLE PRECISION NOT
>>>>>>>> NULL CHECK
>>>>>>>> > (VALUE >= 0.00) */,
>>>>>>>> > VL_UNITARIO MOEDA NOT NULL /* MOEDA = NUMERIC(18,2)
>>>>>>>> DEFAULT 0 */,
>>>>>>>> > VL_TOTAL NUMERIC(18,4) COMPUTED BY
>>>>>>>> > ((CAST(coalesce(QT_QUANTIDADE,0) * coalesce(VL_UNITARIO,0) AS
>>>>>>>> > NUMERIC(18,4) ))),
>>>>>>>> > VL_FORNECEDOR MOEDA NOT NULL /* MOEDA = NUMERIC(18,2)
>>>>>>>> DEFAULT 0 */,
>>>>>>>> > VL_TOTFORNEC NUMERIC(18,4) COMPUTED BY
>>>>>>>> > (((CAST(coalesce(QT_QUANTIDADE,0) * coalesce(VL_FORNECEDOR,0) AS
>>>>>>>> > NUMERIC(18,4) )))),
>>>>>>>> > CD_CCUSTO PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > DT_CADASTRO DATAS /* DATAS = DATE NOT NULL */,
>>>>>>>> > CD_USUARIO PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > CD_EDITOR PK /* PK = INTEGER NOT NULL */,
>>>>>>>> > DT_ATUALIZACAO DATAS /* DATAS = DATE NOT NULL */,
>>>>>>>> > HR_ATUALIZACAO TEMPO /* TEMPO = TIME NOT NULL */
>>>>>>>> > );
>>>>>>>> >
>>>>>>>> > /**** Unique constraints
>>>>>>>> > ****/
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT UNQ_REF_DIA UNIQUE (CD_EMPRESA,
>>>>>>>> > CD_FORNECEDOR, CD_PESSOAREF, DT_DIA);
>>>>>>>> >
>>>>>>>> >
>>>>>>>> > /**** Primary keys
>>>>>>>> > ****/
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT PK_REF_DIA PRIMARY KEY
>>>>>>>> (CD_CODIGO);
>>>>>>>> >
>>>>>>>> > /**** Foreign keys
>>>>>>>> > ****/
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_CC FOREIGN KEY
>>>>>>>> (CD_CCUSTO)
>>>>>>>> > REFERENCES ADM_CCUSTOS (CD_CUSTO) ON UPDATE CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_EDT FOREIGN KEY
>>>>>>>> (CD_EDITOR)
>>>>>>>> > REFERENCES ADM_USUARIO (CD_USUARIO) ON UPDATE CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_EMP FOREIGN KEY
>>>>>>>> (CD_EMPRESA)
>>>>>>>> > REFERENCES GER_EMPRESA (CD_EMPRESA) ON UPDATE CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_MES FOREIGN KEY
>>>>>>>> (CD_MES)
>>>>>>>> > REFERENCES REF_MES (CD_CODIGO) ON DELETE CASCADE ON UPDATE
>>>>>>>> CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_PES FOREIGN KEY
>>>>>>>> > (CD_FORNECEDOR) REFERENCES PES_PESSOA (CD_PESSOA) ON UPDATE
>>>>>>>> CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_PESREF FOREIGN KEY
>>>>>>>> > (CD_PESSOAREF) REFERENCES REF_PESSOAS (CD_CODIGO) ON UPDATE
>>>>>>>> CASCADE;
>>>>>>>> > ALTER TABLE REF_DIA ADD CONSTRAINT FK_REF_DIA_USU FOREIGN KEY
>>>>>>>> (CD_USUARIO)
>>>>>>>> > REFERENCES ADM_USUARIO (CD_USUARIO) ON UPDATE CASCADE;
>>>>>>>> >
>>>>>>>> > --
>>>>>>>> > ______________________________________________
>>>>>>>> > FireBase-BR (www.firebase.com.br) - Hospedado em
>>>>>>>> www.locador.com.br
>>>>>>>> > Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>>>>> > http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>>>>> > Para consultar mensagens antigas:
>>>>>>>> > http://www.firebase.com.br/pesquisa_lista.html
>>>>>>>> >
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Frederico Godoi
>>>>>>>> ______________________________________________
>>>>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>>>>> Para consultar mensagens antigas:
>>>>>>>> http://www.firebase.com.br/pesquisa_lista.html
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Frederico Godoi
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>>
>>>>
>>>> --
>>>>
>>>>
>>>
>>> --
>>> Frederico Godoi
>>>
>>
>>
>> --
>>
>>
>
> --
> Frederico Godoi
>
--
Mais detalhes sobre a lista de discussão lista