[firebase-br] Leitura lenta de uma tabela
Frederico Godoi
frederico.godoi em gmail.com
Quinta Fevereiro 18 15:18:12 -03 2021
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