GARANTIR DESCONTO

Fórum Consumo de cpu estourando com pesquisa SQL #49190

04/02/2005

0

Tem algumas pesquisas sql que estamos fazendo aqui e o consumo de cpu e muito grande tornando os outros computadores lentos demais, alguem tem algura sugestão de como podemos fazer para não acontecer isso mesmo que a consulta tenha que demorar mais ???

Valeu galera


Sremulador

Sremulador

Responder

Posts

04/02/2005

Afarias

Bom, teoricamente esse problema foi minimizado nas versões mais recentes do IB e do FB. Qual versão vc está executando?


T+


Responder

Gostei + 0

04/02/2005

Sremulador

bem estou utilizando o fb 1.5.2.4721

eu já tentei de tudo mas quando tenho que fazer certas pesquisas principalmente quando tem group´s ...


Responder

Gostei + 0

04/02/2005

Afarias

é broca :) ... vc não pode otimizar as consultas? já viu o plano de consulta utilizado pelo FB? já pensou em usar um SP para consultas assim?


T+


Responder

Gostei + 0

05/02/2005

Sremulador

bem estou utilizando uma view mas ja tinha começado a contruir um sp pra ver se consigo dar um geito nisso.


Responder

Gostei + 0

05/02/2005

Afarias

E quanto ao plano, verificou se é o ´melhor´?


T+


Responder

Gostei + 0

05/02/2005

Sremulador

bem quando eu faço sem os groups até que e rapida a pesuisa porem quando coloco fica triste, o plano e automatico mas coloquei em gráfico e ele esta utilizando todos os indices possiveis...


Responder

Gostei + 0

05/02/2005

Afarias

Quanto mais campos em um grupo, realmente mais lenta é a pesquisa. Use apenas no grupo os campos realmente necessários.

T+


Responder

Gostei + 0

09/02/2005

Sremulador

Bem afarias eu estou fazendo na verdade 2 groups um para uma coluna e outro para outra ex

select .... campo1col from tabela
where...
group...
union all
select campo1col .... from tabela
where...
group...

pois o resultado que quero tem que ser em coluna, você teria uma boa solução para este caso ???


Responder

Gostei + 0

09/02/2005

Afarias

não sem conhecer o WHERE, o GROUP, vc quase não postou nada.


T+


Responder

Gostei + 0

11/02/2005

Sremulador

certo mestre ai vai o cod

SELECT F1CD, F1CV, F1FF, F1RC, F1RP, F1CT, PRDS, CPPR, PCSB, SUM(CEVL * CEQT) as CEVL, SUM(CEVH * CEQT) AS CEVH, CAST (NULL AS DECIMAL (16,4)) AS CE, SUM (CEQT) AS CEQT, SUM ((CEFM + CEVH + CEVL) * (CEQT)) AS TOTAL FROM CONTA_AMB_PROCED
INNER JOIN CONTA_AMB_PROCED_MESTRE CAM ON(CPCD=CECP)
INNER JOIN ESPECIFICA_PROCEDCONV_DETALHE on (EPPC=CEPC)
INNER JOIN PROCEDIMENTO ON (PCCD=CEPC)
INNER JOIN PRESTADOR ON (PRCD=CPPR)
INNER JOIN FATURA_DETALHE_AMB ON (F2AM=CPAM)
INNER JOIN FATURA_MESTRE_AMB ON (F1CD=F2F1)
INNER JOIN AMBULATORIO ON (AMCD=CPAM)
WHERE CEAM=CAM.CPAM AND AMTH = ´C´ AND EPPV=CETB AND CETA IN(10,12)
GROUP BY F1CD, F1CV, F1FF, F1RC, F1RP, F1CT, PRDS, CPPR, PCSB
UNION ALL
SELECT F1CD, F1CV, F1FF, F1RC, F1RP, F1CT, PRDS, CPPR, PCSB, SUM(CEVL * CEQT) as CEVL, CAST (NULL AS DECIMAL (16,4)) AS CE, SUM(CEVH * CEQT) AS CEVH, SUM (CEQT) AS CEQT, SUM ((CEFM + CEVH + CEVL) * (CEQT)) AS TOTAL FROM CONTA_AMB_PROCED
INNER JOIN CONTA_AMB_PROCED_MESTRE CAM ON(CPCD=CECP)
INNER JOIN ESPECIFICA_PROCEDCONV_DETALHE on (EPPC=CEPC)
INNER JOIN PROCEDIMENTO ON (PCCD=CEPC)
INNER JOIN PRESTADOR ON (PRCD=CPPR)
INNER JOIN FATURA_DETALHE_AMB ON (F2AM=CPAM)
INNER JOIN FATURA_MESTRE_AMB ON (F1CD=F2F1)
INNER JOIN AMBULATORIO ON (AMCD=CPAM)
WHERE CEAM=CAM.CPAM AND AMTH = ´E´ AND EPPV=CETB AND CETA IN(10,12)
GROUP BY F1CD, F1CV, F1FF, F1RC, F1RP, F1CT, PRDS, CPPR, PCSB

da pra entender, na union o cod e o mesmo apenas a restrição muda para que o valor que desejo saia na outra coluna, você acha que tem como fazer isso


Responder

Gostei + 0

11/02/2005

Afarias

pelo q posso entender, a única coisa q muda entre os 2 selects é:

no primeiro: AMTH = ´C´ e no outro AMTH = ´E´ -- vc poderia evitar o union usando AMHT IN (´C´, ´E´)

sua query realmente está bem pessada, tem *muitos* grupos e ainda corre 2 vezes por causa do UNION

além dos muitos JOINS (todos eles estão usando os índeces né? se for, ok)

talvês o ´pior´ da história é q o WHERE não parece conter nada q possa efetivamente otimizar a query:

|WHERE CEAM=CAM.CPAM

me parece mais um join

|AND AMTH = ´C´

campo de baixa seletividade

|AND EPPV=CETB

??

|AND CETA IN(10,12)

novamente, baixa seletividade

por esse WHERE vc deve estar fazendo algo como alguma seleção NATURAL -- quanto maior for a quntidade de registros desta tabela onde a seleção é NATURAL, mas lento é a consulta toda...


T+


Responder

Gostei + 0

11/02/2005

Sremulador

pelo q posso entender, a única coisa q muda entre os 2 selects é:


não exatamente no select do 1º union eu separo uma coluna
CAST (NULL AS DECIMAL (16,4)) AS CE

ja na mesma posição no 2º union eu ja coloco
SUM(CEVL * CEQT) as CEVL

no primeiro: AMTH = ´C´ e no outro AMTH = ´E´ -- vc poderia evitar o union usando AMHT IN (´C´, ´E´)


sim mas e que na primeira union eu quero que o valor de E aparareça em uma coluna e a de C em outra...


Responder

Gostei + 0

11/02/2005

Afarias

sim mas e que na primeira union eu quero que o valor de E aparareça em uma coluna e a de C em outra...


OK


T+


Responder

Gostei + 0

11/02/2005

Sremulador

teria como eu fazer uma procedure tipo if CAMPO = E valor soma com a quant atual else ...


Responder

Gostei + 0

11/02/2005

Afarias

Sim. Um procedure pode ser uma solução -- já q ao q parece vc não pode ter um WHERE melhor e pelo q vc disse o plano já está otimizado.



T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar