[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