[firebase-br] Lentidão em SQL

Zottis bzottis em ig.com.br
Sáb Jun 19 13:05:56 -03 2010


Pessoal, to tentando fazer uma rotina para retornar de uma lista de clients
Se uma certa Tabela( FAR_MTR)  tem uma conta lançada, mas as contas, tem o
vínculo de várias FAR_MTR ou seja
Não tenho um Campo único para indexar
Na Conta a Receber tem um campo com várias FAR_MTR Declaradas 
00009/09 - 00205/09 - 00641/09

O problema é que na cláusula o f.codigo_montado é um campo computed by
Alguém saberia como posso melhorar a performance da query?


Desde já agradeço.


A estrutura da tabela FAR_MTR e da CtaREC está abaixo da SQL.

   select  count(F.COD_FAR_MTR),
           list(f.codigo_montado, ', '), F.cod_grupo, F.cod_cliente
    From FAR_MTR F
            Where F.cod_cliente = :VarCod_Cliente
                  and F.baixado  = 'S'
                  and F.valor_total_far > 0
                  and NOT ((select count( CR.cod_conta) from ctarec CR where
cr.far_mtrs containing f.codigo_montado) > 0)
group by f.cod_grupo, f.cod_cliente



CREATE TABLE FAR_MTR (
    COD_FAR_MTR              PK NOT NULL /* PK = INTEGER NOT NULL */,
    CODIGO_ANUAL             PK /* PK = INTEGER NOT NULL */,
    DATA_CAD                 DATAS /* DATAS = DATE */,
    COD_GRUPO                PK /* PK = INTEGER NOT NULL */,
    COD_USUARIO              PK /* PK = INTEGER NOT NULL */,
    COD_EMPRESA              PK /* PK = INTEGER NOT NULL */,
    COD_CLIENTE              PK /* PK = INTEGER NOT NULL */,
    COD_TRANSP_COLETA        PK /* PK = INTEGER NOT NULL */,
    COD_VEICULO_COLETA       PK /* PK = INTEGER NOT NULL */,
    COD_MOT_COLETA           PK /* PK = INTEGER NOT NULL */,
    COD_TRANSP_DEST_FINAL    PK /* PK = INTEGER NOT NULL */,
    COD_FORNEC_DEST_FINAL    PK /* PK = INTEGER NOT NULL */,
    COD_VEICULO_DEST_FINAL   PK /* PK = INTEGER NOT NULL */,
    COD_MOT_DEST_FINAL       PK /* PK = INTEGER NOT NULL */,
    COD_DESCRICAO            INTEIRO /* INTEIRO = INTEGER */,
    QTD_BAMBONAS             INTEIRO /* INTEIRO = INTEGER */,
    IMPRESSO                 BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N'
CHECK (value in ('N' , 'S')) */,
    DATA_IMPRESSAO           DATAS /* DATAS = DATE */,
    LACRE_NUMERO             VARCHAR_120 /* VARCHAR_120 = VARCHAR(120) */,
    DATA_COLETA              DATAS /* DATAS = DATE */,
    DATA_BAIXA               DATAS /* DATAS = DATE */,
    PESO_BRUTO               TAXAS /* TAXAS = DOUBLE PRECISION DEFAULT 0 NOT
NULL */,
    PESO_LIQUIDO             TAXAS /* TAXAS = DOUBLE PRECISION DEFAULT 0 NOT
NULL */,
    NUMERO_COLETA            INTEIRO /* INTEIRO = INTEGER */,
    OBS                      MEMO /* MEMO = BLOB SUB_TYPE 1 SEGMENT SIZE 240
*/,
    TOTAL_PRODUTOS           MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    BAIXADO                  BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N'
CHECK (value in ('N' , 'S')) */,
    COD_USUARIO_BAIXA        INTEIRO /* INTEIRO = INTEGER */,
    DESCRICAO_ADIC_RESIDUO   VARCHAR_40 /* VARCHAR_40 = VARCHAR(40) */,
    INSTRUCAO_ESPECIAL       VARCHAR_40 /* VARCHAR_40 = VARCHAR(40) */,
    PESO_COLETADO            DOUBLE_MEU /* DOUBLE_MEU = DOUBLE PRECISION
DEFAULT 0 */,
    STATE                    STATE_TABELA /* STATE_TABELA = CHAR(1) DEFAULT
'I' NOT NULL CHECK (VALUE IN ('I','N')) */,
    EXCLUIDO_POR             INTEIRO /* INTEIRO = INTEGER */,
    DATA_EXCLUSAO            DATAS /* DATAS = DATE */,
    HORA_EXCLUSAO            TEMPO /* TEMPO = TIME */,
    DELETADO                 BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N'
CHECK (value in ('N' , 'S')) */,
    ENVIADO                  BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N'
CHECK (value in ('N' , 'S')) */,
    COD_CERTIFICADO          INTEIRO /* INTEIRO = INTEGER */,
    VALOR_KILO               MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    VALOR_TAXA_RECOLHIMENTO  MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    DATA_PREVISAO_COLETA     DATAS /* DATAS = DATE */,
    VALOR_KILOS_COLETADO     COMPUTED BY (CAST(Peso_coletado * Valor_kilo AS
NUMERIC(15,2))),
    VALOR_TOTAL_FAR          COMPUTED BY (CAST(VALOR_KILOS_COLETADO +
VALOR_TAXA_RECOLHIMENTO AS NUMERIC(15,2))),
    COD_MASTER               PK /* PK = INTEGER NOT NULL */,
    COD_CLASSIF_RESIDUO      PK /* PK = INTEGER NOT NULL */,
    COD_EDITOR               PK /* PK = INTEGER NOT NULL */,
    CODIGO_MONTADO           COMPUTED BY (RIGHT('00000' || CODIGO_ANUAL,
5)||'/'||LPAD(extract(year from Data_cad)-2000, 2, '0'))
);




/***************************************************************************
***/
/****                             Primary Keys
****/
/***************************************************************************
***/

ALTER TABLE FAR_MTR ADD CONSTRAINT PK_FAR_MTR PRIMARY KEY (COD_FAR_MTR);


/***************************************************************************
***/
/****                             Foreign Keys
****/
/***************************************************************************
***/

ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_CLASSIF FOREIGN KEY
(COD_CLASSIF_RESIDUO) REFERENCES CLASSIF_RESIDUOS (COD_CLASSIFICACAO) ON
UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_CLIENTE FOREIGN KEY
(COD_CLIENTE) REFERENCES CLIENTES (COD_CLIENTE) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_COD_FORNEC_DEST_F FOREIGN KEY
(COD_FORNEC_DEST_FINAL) REFERENCES FORNECEDORES (COD_FORNEC) ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_COD_GRUPO FOREIGN KEY
(COD_GRUPO) REFERENCES GRUPO_CIDADES (CODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_EDITOR FOREIGN KEY
(COD_EDITOR) REFERENCES USUARIOS (COD_USUARIO) ON UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_EMPRESA FOREIGN KEY
(COD_EMPRESA) REFERENCES EMPRESA (CODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_MOT_COLETA FOREIGN KEY
(COD_MOT_COLETA) REFERENCES MOTORISTAS (CODIGO) ON UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_MOT_DEST_F FOREIGN KEY
(COD_MOT_DEST_FINAL) REFERENCES MOTORISTAS (CODIGO) ON UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_TRANSP_COLETA FOREIGN KEY
(COD_TRANSP_COLETA) REFERENCES TRANSPORTADORAS (COD_TRANSP) ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_TRANSP_DEST_F FOREIGN KEY
(COD_TRANSP_DEST_FINAL) REFERENCES TRANSPORTADORAS (COD_TRANSP) ON UPDATE
CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_USUARIO FOREIGN KEY
(COD_USUARIO) REFERENCES USUARIOS (COD_USUARIO) ON UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_VEIC_COLETA FOREIGN KEY
(COD_VEICULO_COLETA) REFERENCES VEICULOS (CODIGO) ON UPDATE CASCADE;
ALTER TABLE FAR_MTR ADD CONSTRAINT FK_FAR_MTR_VEIC_DEST_F FOREIGN KEY
(COD_VEICULO_DEST_FINAL) REFERENCES VEICULOS (CODIGO) ON UPDATE CASCADE;


/***************************************************************************
***/
/****                               Indices
****/
/***************************************************************************
***/

CREATE INDEX FAR_MTR_IDX_COD_ANUAL ON FAR_MTR (CODIGO_ANUAL);
CREATE INDEX FAR_MTR_IDX_COD_MASTER ON FAR_MTR (COD_MASTER);
CREATE INDEX FAR_MTR_IDX_DATA ON FAR_MTR (DATA_CAD);
CREATE INDEX FAR_MTR_IDX_DATA_BAIXA ON FAR_MTR (DATA_BAIXA);
CREATE INDEX FAR_MTR_IDX_DATA_COLETA ON FAR_MTR (DATA_COLETA);
CREATE INDEX FAR_MTR_IDX_DATA_PREVISAO ON FAR_MTR (DATA_PREVISAO_COLETA);
CREATE INDEX FAR_MTR_IDX_ENVIADO ON FAR_MTR (ENVIADO);
CREATE INDEX FAR_MTR_IDX_LACRE ON FAR_MTR (LACRE_NUMERO);




CREATE TABLE CTAREC (
    COD_CONTA          PK /* PK = INTEGER NOT NULL */,
    COD_CLIENTE        PK /* PK = INTEGER NOT NULL */,
    COD_EMPRESA        PK /* PK = INTEGER NOT NULL */,
    DATA_CAD           DATAS /* DATAS = DATE */,
    VENCIMENTO         DATAS /* DATAS = DATE */,
    COD_USUARIO        PK /* PK = INTEGER NOT NULL */,
    PAGO               BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N' CHECK
(value in ('N' , 'S')) */,
    DATA_PGTO          DATAS /* DATAS = DATE */,
    COD_REG            PK /* PK = INTEGER NOT NULL */,
    OBS                MEMO /* MEMO = BLOB SUB_TYPE 1 SEGMENT SIZE 240 */,
    FATURA_NO          INTEIRO /* INTEIRO = INTEGER */,
    DUPLICATA          VARCHAR_15 /* VARCHAR_15 = VARCHAR(15) */,
    VALOR              MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    DESCONTO           MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    DESCONTO_TAXA      TAXAS /* TAXAS = DOUBLE PRECISION DEFAULT 0 NOT NULL
*/,
    TOTAL_PAGO         MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    JUROS              MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    DESPESAS_EXTRAS    MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    KILOS_EXCEDENTES   MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    TAXA_RECOLHIMENTO  MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    BOMBONAS           MOEDA /* MOEDA = NUMERIC(15,2) DEFAULT 0 */,
    EXCLUIDO_POR       INTEIRO /* INTEIRO = INTEGER */,
    DATA_EXCLUSAO      DATAS /* DATAS = DATE */,
    HORA_EXCLUSAO      TEMPO /* TEMPO = TIME */,
    DELETADO           BOLEANO_S /* BOLEANO_S = CHAR(1) DEFAULT 'S' NOT NULL
CHECK (VALUE IN ('N','S')) */,
    FAR_MTRS           VARCHAR_100 /* VARCHAR_100 = VARCHAR(100) */,
    MES                INTEIRO /* INTEIRO = INTEGER */,
    ANO                INTEIRO /* INTEIRO = INTEGER */,
    COD_GRUPO          PK /* PK = INTEGER NOT NULL */,
    BOLETO_EMITIDO     COMPUTED BY (case
                     when (SELECT COUNT (B.Contano) FROM Boletos B WHERE
B.Contano = CTAREC.Cod_conta and B.Deletado = 'N')> 0 then 'S'
                     when (SELECT COUNT (B.Contano) FROM Boletos B WHERE
B.Contano = CTAREC.Cod_conta and B.Deletado = 'N')= 0 then 'N'
                             end),
    NF                 INTEIRO /* INTEIRO = INTEGER */,
    DIAS_ATRASO        COMPUTED BY (CASE
WHEN (PAGO = 'N') AND (VENCIMENTO < CURRENT_DATE) THEN
  CURRENT_DATE - VENCIMENTO
WHEN (PAGO = 'S') AND (VENCIMENTO < DATA_PGTO)  THEN
 DATA_PGTO - VENCIMENTO
ELSE
  0
END),
    SITUACAO           COMPUTED BY (CASE
WHEN (PAGO = 'N') AND (VENCIMENTO >= CURRENT_DATE) THEN
  'Conta Aberta'
WHEN (PAGO = 'N') AND (VENCIMENTO < CURRENT_DATE) THEN
  'Conta Vencida'
WHEN (PAGO = 'S') THEN
'Conta Paga'
END),
    VLR_JUROS          COMPUTED BY (CASE WHEN (PAGO = 'N') and
(boleto_emitido = 'N') THEN
                             CAST(((VALOR + DESPESAS_EXTRAS +
Taxa_recolhimento
                                     + Kilos_excedentes + BOMBONAS) -
TOTAL_PAGO) * JUROS * DIAS_ATRASO / 100 / 30 AS NUMERIC(15,2))
                                         WHEN (PAGO='S')or (boleto_emitido =
'S') THEN
                                   0
                                    END),
    JUROSCOBRADO       COMPUTED BY (CAST((VALOR + DESPESAS_EXTRAS +
Taxa_recolhimento
                             + Kilos_excedentes + BOMBONAS) * JUROS *
DIAS_ATRASO / 100 / 30 AS NUMERIC(15,2))),
    SALDO              COMPUTED BY (CASE
                         WHEN (PAGO = 'N')  THEN
                            CAST(VALOR + VLR_JUROS + DESPESAS_EXTRAS +
Taxa_recolhimento
                             + Kilos_excedentes + BOMBONAS - (DESCONTO +
TOTAL_PAGO) AS NUMERIC(15,2))
                         WHEN (PAGO='S') THEN
                              0
                                   END),
    DIA_SEMANA         COMPUTED BY (case
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 0 ) then 'Domingo'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 1 ) then 'Segunda'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 2 ) then 'Terça'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 3 ) then 'Quarta'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 4 ) then 'Quinta'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 5 ) then 'Sexta'
   when (  EXTRACT(WEEKDAY FROM Vencimento) = 6 ) then 'Sábado'
end),
    COD_FARS_MTRS      VARCHAR_180 /* VARCHAR_180 = VARCHAR(180) */,
    COD_FATUR          INTEIRO /* INTEIRO = INTEGER */,
    COD_FATUR_EDIT     INTEIRO /* INTEIRO = INTEGER */,
    SERASA             BOLEANO_N /* BOLEANO_N = CHAR(1) DEFAULT 'N' CHECK
(value in ('N' , 'S')) */,
    DATA_SERASA        DATAS /* DATAS = DATE */,
    DATA_BAIXA_SERASA  DATAS /* DATAS = DATE */,
    COD_EDITOR         PK /* PK = INTEGER NOT NULL */
);




/***************************************************************************
***/
/***                              Primary Keys
***/
/***************************************************************************
***/

ALTER TABLE CTAREC ADD CONSTRAINT PK_CTAREC PRIMARY KEY (COD_CONTA);


/***************************************************************************
***/
/***                              Foreign Keys
***/
/***************************************************************************
***/

ALTER TABLE CTAREC ADD CONSTRAINT FK_CTAREC_CLIENTE FOREIGN KEY
(COD_CLIENTE) REFERENCES CLIENTES (COD_CLIENTE) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE CTAREC ADD CONSTRAINT FK_CTAREC_COD_EMPRESA FOREIGN KEY
(COD_EMPRESA) REFERENCES EMPRESA (CODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE CTAREC ADD CONSTRAINT FK_CTAREC_COD_GRUPO FOREIGN KEY
(COD_GRUPO) REFERENCES GRUPO_CIDADES (CODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE CTAREC ADD CONSTRAINT FK_CTAREC_REG_NO FOREIGN KEY (COD_REG)
REFERENCES REGISTROS (COD_REG);
ALTER TABLE CTAREC ADD CONSTRAINT FK_CTAREC_USUARIO FOREIGN KEY
(COD_USUARIO) REFERENCES USUARIOS (COD_USUARIO) ON UPDATE CASCADE;


/***************************************************************************
***/
/***                                Indices
***/
/***************************************************************************
***/

CREATE INDEX CTAREC_IDXANO ON CTAREC (ANO);
CREATE INDEX CTAREC_IDXDATA_BAIXA_SERASA ON CTAREC (DATA_BAIXA_SERASA);
CREATE INDEX CTAREC_IDXDATA_SERASA ON CTAREC (DATA_SERASA);
CREATE INDEX CTAREC_IDXDUPLCTA ON CTAREC (DUPLICATA);
CREATE INDEX CTAREC_IDXFATURA ON CTAREC (FATURA_NO);
CREATE INDEX CTAREC_IDXMES ON CTAREC (MES);
CREATE INDEX CTAREC_IDXSERASA ON CTAREC (SERASA);
CREATE INDEX CTAREC_IDX_COD_FARS_MTRS ON CTAREC (COD_FARS_MTRS);
CREATE INDEX CTAREC_IDX_FAR_MTRS ON CTAREC (FAR_MTRS);
CREATE INDEX CTAREC_IDX_NF ON CTAREC (NF);
CREATE INDEX CTAREC_IDX_PAGO ON CTAREC (PAGO);
CREATE INDEX CTAREC_IDX_VENC ON CTAREC (VENCIMENTO);
CREATE INDEX IDX_CTAREC_COD_FATURAMENTO ON CTAREC (COD_FATUR);






Mais detalhes sobre a lista de discussão lista