Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Então pessoal queria melhorar minha consulta deixar ele menor e se possível mais rápida.
Hoje está assim:
SELECT
pn.OID,
pn.NOME,
pt.NOME_DO_TIPO,
pt.TIPO,
pf.CPF,
pj.CGC,
CASE
WHEN pf.OID
THEN 'FISICA'
WHEN pj.OID
THEN 'JURIDICA'
ELSE ''
END AS DESCRICAO
FROM
pessoa pn
LEFT JOIN parte pt
ON
pn.OID = pt.OID
------------------------------------
LEFT JOIN pessoa_fisica pf
ON
pn.OID = pf.OID
----------------------------------
LEFT JOIN pessoa_juridica pj
ON
pn.OID = pj.OID
---------------------------------
WHERE
(
(
NOT EXISTS
(
SELECT
NULL
FROM
advogado a
WHERE
pn.OID = a.OID
)
)
AND
(
NOT EXISTS
(
SELECT
NULL
FROM
advogado_contrario ac
WHERE
pn.OID = ac.OID
)
)
AND pt.TIPO <= 1
)
ORDER BY
pn.NOME;Essa consulta e feita pontualmente então não tem índice, sobre o not exists coloquei pois na tabela pessoa tem tudo e os mesmo não deve sair no relatório.
Queria saber se tem como melhora no sentido de não tem tantas cláusulas, tentar utilizar menos requisições. De repente na mesma condição conseguir realizar mais coisas, só que sou novo nesse parte da banco e não consigo diminuir.
lesilva
Se isso for para gerar um relatório via aplicação, eu recomendo você a fazer as consultas de forma separadas.
Vale lembrar que quanto mais condições no WHERE desde que sejam campos como CHAVES e/ou INDICES melhor o desempenho.
Dúvida: Do jeito que está, a sua clausula traz exatamente o que você quer?
Pelos nomes das suas tabelas e como você esta amarrando, você procura em PESSOA e quer que ela esteja em PESSOA_FISICA e PESSOA_JURIDICA, é isso mesmo?
Como no seu caso existe uma regra de negócio, eu no seu caso faria assim:
Primeiro realizaria o ***SELECT ***na tabela para se obter os registros:
***#Primeiro select***
SELECT
pessoa.OID,
pessoa.NOME,
parte.NOME_DO_TIPO,
parte.TIPO,
pessoaFisica.CpessoaFisica,
pessoaJuridica.CGC,
CASE
WHEN pessoaFisica.OID
THEN 'FISICA'
WHEN pessoaJuridica.OID
THEN 'JURIDICA'
ELSE ''
END AS DESCRICAO
FROM pessoa LEFT JOIN parte ON pessoa.OID = parte.OID
LEFT JOIN pessoa_fisica pessoaFisica ON pessoa.OID = pessoaFisica.OID
LEFT JOIN pessoa_juridica pessoaJuridica ON pessoa.OID = pessoaJuridica.OID
WHERE parte.TIPO <= 1
ORDER BY pessoa.NOME asc;
Para cada registro encontrado eu faria um acesso nas outras tabela passando o ***OID*** da tabela ***PESSOA*** limitanto a apenas ***1 registro***, se existir nas tabelas, então eu desprezo o registro, caso contrário eu movimento para o relatório.
***#Segundo select***
SELECT OID
FROM advogado
WHERE OID = "pessoa.OID" -- Para cada retorno do ***#Primeiro select*** passa o OID para verificar se existe na tabela;
LIMIT 1;
***#Terceiro select***
SELECT OID
FROM advogado_contrario
WHERE OID = "pessoa.OID" -- Para cada retorno do ***#Primeiro select*** passa o OID para verificar se existe na tabela;
LIMIT 1;
Desta forma na hora de gerar o relatório se for via ***aplicação (PHP, ASP, C, C#, Java, ou seja lá qual for a linguagem)*** o tempo de resposta será muito menor.
O melhor é você adicionar mais campos no seu ***WHERE ***como limite por ***data***, por ***código***, por ***tipo***, etc... utilizar se possivel a maior quantidade de ***colunas chave da tabela***, criar ***indice*** e evitar o uso de ***JOIN's***, pois o processo dessa solicitação geralmente costuma ser bem ***onerosa*** para o ***banco de dados***.
Eu estou na dúvida sobre o resultado da sua query, acho que você deveria apartar,
Primeiro um select
-
pessoa inner join parte
-
pessoa inner join pessoa_fisica
-
Para obter a lista de pessoa.pessoa_fisica
-
Verificar nas tabelas advogado e advogado_contrario.
-
Se encontrar despreza, se não encontrar move saida
Segundo um select
-
pessoa inner join parte
-
pessoa inner join pessoa_juridica
-
Para obter a lista de pessoa.pessoa_juridica
-
Verificar nas tabelas advogado e advogado_contrario.
-
Se encontrar despreza, se não encontrar move saida
Não seria isso?
Se a minha resposta for útil não esqueça de agradecer e votar positivo.
Espero ter ajudado de alguma forma.
AttFelipe Guedes Coutinho
Essa consulta é feita diretamente no banco, essas tabela são relacionadas pessoa contem praticamente todos dos dados, física pego somente o cpf, jurídica somente o CNJ e na parte pego o tipo se é física, jurídica, se é cliente, contrario entre outras opções de tipo.
Queria um forma de maximizar a consulta de repente fazer um maior numero de comparação dentro do CASE ou join e se possível retirar o NOT EXISTS.
Analisou o Plano de Execução ?
As tabelas tem índices ?
As estatíscas estão atualizadas ?
Este not exists nos "devegados" é necessário ? Um outer join talvez fosse melhor.