RES: [oracle_br] Re: Consulta SQL
Obrigado Chiappa, eu tinha visto alguns dos links que vc informou. Vou fazer as verificações. Novamente, obrigado. Carlos Henrique De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Enviada em: sexta-feira, 21 de outubro de 2016 16:34 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: Consulta SQL Bom, se rodando o SQL fora da aplicação mas conectado no mesmo banco/usuário/etc vc obtém o retorno desejado, mas o Exato Mesmo SQL pela aplicação falha, tá *** TOTALMENTE COMPROVADO *** que é uma questão FORA DO BANCO, então a maioria de nós, especialistas em banco que somos aqui, Não Vamos ter como te ajudar O que vc pode fazer aí é : a. usar os recursos que a tua tool de programação te dê (junto, talvez, com um TRACE DE SQL na sessão que ela abre no banco) pra se Certificar que o stack da aplicação (ie, drivers, métodos de conexão ao banco, geradores de SQL, etc, etc) NÂO estão alterando de forma nenhuma o SQL que vai ser mandado pro banco, confirmando que ele está 100% Idêntico ao que roda com sucesso por fora da aplicação b. dar ** todos ** os detalhes de versão de PHP, webserver, drivers em uso, etc, E criar um caso de teste mínimo onde a questão apareça, para que algum EVentual progrtamador PHP que passe aqui pelo Fórum possa reproduzir sua issue e palpitar em cima Sobre performance, sim : se o volume de dados for significativo, pode sim ser interessante se usar o operador CONTAINS ao invés do LIKE trabalhando em cima de um índice de texto - http://www.orafaq.com/node/1918 , https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:73326990501799 e http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning são exemplos... []s Chiappa
[oracle_br] Re: Consulta SQL
Bom, se rodando o SQL fora da aplicação mas conectado no mesmo banco/usuário/etc vc obtém o retorno desejado, mas o Exato Mesmo SQL pela aplicação falha, tá *** TOTALMENTE COMPROVADO *** que é uma questão FORA DO BANCO, então a maioria de nós, especialistas em banco que somos aqui, Não Vamos ter como te ajudar O que vc pode fazer aí é : a. usar os recursos que a tua tool de programação te dê (junto, talvez, com um TRACE DE SQL na sessão que ela abre no banco) pra se Certificar que o stack da aplicação (ie, drivers, métodos de conexão ao banco, geradores de SQL, etc, etc) NÂO estão alterando de forma nenhuma o SQL que vai ser mandado pro banco, confirmando que ele está 100% Idêntico ao que roda com sucesso por fora da aplicação b. dar ** todos ** os detalhes de versão de PHP, webserver, drivers em uso, etc, E criar um caso de teste mínimo onde a questão apareça, para que algum EVentual progrtamador PHP que passe aqui pelo Fórum possa reproduzir sua issue e palpitar em cima Sobre performance, sim : se o volume de dados for significativo, pode sim ser interessante se usar o operador CONTAINS ao invés do LIKE trabalhando em cima de um índice de texto - http://www.orafaq.com/node/1918 , https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:73326990501799 e http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning são exemplos... []s Chiappa
[oracle_br] Re: consulta sql em ambiente DW
Bom dia Orfeu, Neste caso, o cenário ficou incompleto e para mostrá-lo todo, seria informação demais para postar. Eu começaria buscando o que a "query está fazendo com banco", para em seguida identificar o plano de execução. Para identificar, abra outra sessão na mesma instance enquanto a sua query esteja "rodando" e execute: --executando.sql set pagesize 100; set linesize 160; column sid format a6; column serial format a6; column processo format a60; column inicio format a20; column username format a20; SELECT to_char(s.sid) sid, to_char(s.serial#) serial, s.username, substr(decode(target_desc, NULL, decode(target, NULL, opname, concat(opname, concat(' - ', target))), decode(target, NULL, concat(opname, concat(' : ', target_desc)), concat(opname, concat(' : ', concat(target_desc, concat(' - ', target)), 1, 55) "Processo", to_char(start_time, 'dd/mm/ hh24:mi:ss') "Inicio", totalwork tot_block, totalwork - sofar "A processar" FROM v$session_longops l, v$session s WHERE sofar < totalWork AND s.sid = l.sid; Depois, pegue o plano de execução da sua query original com: EXPLAIN PLAN FOR --seu SQL -- SET LINESIZE 130 SET PAGESIZE 0 SELECT * FROM table(DBMS_XPLAN.DISPLAY); Repita o EXPLAIN, mas retirando TODOS os hints e compare os dois. É um começo ... Ederson Elias DBA Oracle http://br.linkedin.com/pub/ederson-elias/24/8b/8b0 Labor improbus omnia vincit --- Em oracle_br@yahoogrupos.com.br, orfeu lima escreveu > > Boa tarde Srs. do grupo, > Temos um ambiente de dw com as seguintes configurações. > S. O - Red Hat 5.5 > Oracle 11.2.0.3 > Discos em ASM > Estou tentando executar o select abaixo, mas não estou conseguindo. A > instrução está executando mas não termina. > Gostaria de pedir sugestão aos membros do grupo para poder estar melhorando > essa instrução. > Índices foram criados. > Obrigado > Segue abaixo a instrução sql. > SELECT > /*+ index_join(TBBENEFICIARIO IDXTPSEXO,IDXLOTE,IDXLOTE2) */ > /*+ index_join(TBPROJETO > IDXPROJETO,IDXTP_PROJETO,IDX_PROJETO_COMPLEMENTA,IDXSUPER2,IDXPROJMUN) */ > /*+ index_join(TBTIPOPROJETO IDXTPPROJETO) */ > /*+ index_join(TBProjetoTipoFase IDXTPPROJ,IDXTPROJTPFASE) */ > /*+ index_join(TBPROJETOCONSTITUICAO IDXTPROJTPFASE2) */ > /*+ index_join(TBTIPOSEXO IDXTPSEXO2) */ > /*+ index_join(TBLOTE IDXLOTE2) */ > /*+ index_join(TBDAPGerada IDXGERADA2) */ > /*+ index_join(TBSR IDXSUPER) */ > /*+ index_join(TBUF IDXSUPERUF) */ > /*+ index_join(TBUF IDXSUPERUF) */ > /*+ index_join(TBMUNICIPIO IDXMUNICIPIO) */ > /*+ index_join(TBCREDITO IDXTBCREDITO,IDXTPAGFIN2) */ > /*+ index_join(TBTIPOCREDITO IDXTPTBCREDITO) */ > /*+ index_join(TBAgenteFinanceiro IDXTPAGFIN) */ > /*+ index_join(TBAssentamento IDXASSENTA,IDXASSENTA4) */ > /*+ index_join(TBTipoSituacao IDXASSENTA3) */ > BENEFICIARIO.BENEFICIARIO_IDENT_CODIGO CodigoBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_NOME NomeBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_PAI PaiBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_MAE MaeBeneficiario, > NACIONALIDADE.BENEFICIARIO_TPNAC_CODIGO CodigoNacionalidade, > NACIONALIDADE.BENEFICIARIO_TPNAC_DESC Nacionalidade, > ESTADOCIVIL.BENEFICIARIO_TPESTCIV_CODIGO CodigoEstadoCivil, > ESTADOCIVIL.BENEFICIARIO_TPESTCIV_DESC EstadoCivil, > BENEFICIARIO.BENEFICIARIO_IDENT_CPF CPF, > PROJETO.PROJETO_IDENT_CODIGO CodigoProjeto, > PROJETO.PROJETO_IDENT_NOME NomeProjeto, > BENEFICIARIO.BENEFICIARIO_IDENT_PROCADM NumeroProcesso, > LOTE.beneficiario_lote_numero NumeroLote, > SEXO.sexo_codigo CodigoSexo, > SEXO.sexo_descricao Sexo, > BENEFICIARIO.BENEFICIARIO_IDENT_DTNASC DataNascimento, > BENEFICIARIO.BENEFICIARIO_IDENT_DTATUALIZA DataAtualizacao, > SITUACAO.BENEFICIARIO_TIPOSIT_CODIGO CodigoSituacao, > SITUACAO.BENEFICIARIO_TIPOSIT_DESC Situacao, > ASSENTAMENTO.BENEFICIARIO_ASSENT_SIT_DATA DataSituacao, > BENEFICIARIO.BENEFICIARIO_IDENT_DTHOMOLOG DataAssentado, > CASE WHEN DAP_GERADA.Cod_DAP IS NOT NULL THEN 'SIM' ELSE 'NÃO' END PossuiDAP, > DAP_GERADA.Cod_DAP CodigoDAP, > DAP_GERADA.ID_dap_gerada DAPGerada, > DAP_GERADA.DAP_grupo DAPGrupo, > DAP_GERADA.DAP_modelo DAPModelo, > SR.sr_codigo CodigoSR, > SR.sr_nome NomeSR, > UF.COUF CodigoUF, > UF.NOUF NomeUF, > MUNICIPIO.COMUNIBGE CodigoIBGE, > MUNICIPIO.NOMUN Municipio, > PROJETOCOMPLEMENTO.Area Area, > PROJETOCOMPLEMENTO.Capacidade Capacidade, > PROJETOTIPOFASE.projeto_tipofase_codigo CodigoFase, > PROJETOTIPOFASE.projeto_tipofase_descricao Fase, > TIPOPROJETO.projeto_tipoprojeto_codigo CodigoTipoProjeto, > TIPOPROJETO.projeto_tipoprojeto_descricao TipoProjeto, > PROJETOCOMPLEMENTO.DataCriacao DataCriacao, > CREDITO.crd_id CodigoCredito, > TIPOCREDITO.tpc_codigo CodigoTipoCredito, > tiPOCREDITO.tpc_descricao TipoCredito, > CASE WHEN crd_complementacao = '0' THEN CREDITO.crd_valor ELSE 0 END > ValorCredito, > CREDITO.crd_data_recebimento DataCredito, > CASE WHEN cr
[oracle_br] Re: consulta sql em ambiente DW
Bom, esse "não termina" certamente quer dizer que o SQL está demorando muito, né não ? Sendo isso, Sorry, colega, mas se vc acha que alguém é capaz de olhar para esse monstrengo fazendo JOIN de MAIS DE UMA DÚZIA DE TABELAS e ,sem informações, sem saber a DISTRIBUIÇÃO/VOLUME/CARDINALIDADE DOS DADOS, ser capaz de dizer algo, vc tá esperando um pouquinho demais Meu conselho : a. levante EXATAMENTE o Volume e a Cardinalidade/Distribuição dos dados (principalmente nas colunas sendo usadas para filtro) b. levante as condições FÍSICAS das tabelas, em especial as características que podem ser usadas para "pular" parte do acesso aos dados (tais como ìndices existentes e seus tipos, PARTICIONAMENTO, PKs, FKs, Domínio dos dados, etc) c. levante como estão as Estatísticas das tabelas, principalmente quanto aos HISTOGRAMAS nas colunas que vc sabe/descobriu que possuem distribuição de dados irregular d. retire da query temporariamente as tabelas/colunas de pequena monta que trazem informação cadastral e/ou tem pequeno volume de dados (como Municipio e UF, provavelmente), mas não só elas - só VOCÊ sabe quais ==> feito isso, vc vai capturar um Plano de Execução real e completo (INCLUSIVE com A_ROWS e E-ROWS, condiçoes de filtro, tudinho) , que daí vc poderá COMPARAR a quantidade de linhas de cada passo do plano com o que vc levantou acima... Isso CERTAMENTE vai te dar algum insight... E é claro, num ambiente DW é Extremamente Comum que vc veja full table scans, pois vc via de regra PRECISA recuperar um montão de linhas, lendo segmentos inteiros, e o FTS é ESPECIALMENTE eficiente nisso, yep ??? Considere a possibilidade de TIRAR esses HINTs "forçando" uso de índices... E outra : nesses casos é simplesmente CRÍTICO, e pode ser a diferença entre SUCESSO e FALHA, a organização física, ie, vc ter tabelas particionadas aonde haja partições que possam ser puladas, views materializadas que TRAGAM resultados pré-computados, é por aí []s Chiappa --- Em oracle_br@yahoogrupos.com.br, orfeu lima escreveu > > Boa tarde Srs. do grupo, > Temos um ambiente de dw com as seguintes configurações. > S. O - Red Hat 5.5 > Oracle 11.2.0.3 > Discos em ASM > Estou tentando executar o select abaixo, mas não estou conseguindo. A > instrução está executando mas não termina. > Gostaria de pedir sugestão aos membros do grupo para poder estar melhorando > essa instrução. > Índices foram criados. > Obrigado > Segue abaixo a instrução sql. > SELECT > /*+ index_join(TBBENEFICIARIO IDXTPSEXO,IDXLOTE,IDXLOTE2) */ > /*+ index_join(TBPROJETO > IDXPROJETO,IDXTP_PROJETO,IDX_PROJETO_COMPLEMENTA,IDXSUPER2,IDXPROJMUN) */ > /*+ index_join(TBTIPOPROJETO IDXTPPROJETO) */ > /*+ index_join(TBProjetoTipoFase IDXTPPROJ,IDXTPROJTPFASE) */ > /*+ index_join(TBPROJETOCONSTITUICAO IDXTPROJTPFASE2) */ > /*+ index_join(TBTIPOSEXO IDXTPSEXO2) */ > /*+ index_join(TBLOTE IDXLOTE2) */ > /*+ index_join(TBDAPGerada IDXGERADA2) */ > /*+ index_join(TBSR IDXSUPER) */ > /*+ index_join(TBUF IDXSUPERUF) */ > /*+ index_join(TBUF IDXSUPERUF) */ > /*+ index_join(TBMUNICIPIO IDXMUNICIPIO) */ > /*+ index_join(TBCREDITO IDXTBCREDITO,IDXTPAGFIN2) */ > /*+ index_join(TBTIPOCREDITO IDXTPTBCREDITO) */ > /*+ index_join(TBAgenteFinanceiro IDXTPAGFIN) */ > /*+ index_join(TBAssentamento IDXASSENTA,IDXASSENTA4) */ > /*+ index_join(TBTipoSituacao IDXASSENTA3) */ > BENEFICIARIO.BENEFICIARIO_IDENT_CODIGO CodigoBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_NOME NomeBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_PAI PaiBeneficiario, > BENEFICIARIO.BENEFICIARIO_IDENT_MAE MaeBeneficiario, > NACIONALIDADE.BENEFICIARIO_TPNAC_CODIGO CodigoNacionalidade, > NACIONALIDADE.BENEFICIARIO_TPNAC_DESC Nacionalidade, > ESTADOCIVIL.BENEFICIARIO_TPESTCIV_CODIGO CodigoEstadoCivil, > ESTADOCIVIL.BENEFICIARIO_TPESTCIV_DESC EstadoCivil, > BENEFICIARIO.BENEFICIARIO_IDENT_CPF CPF, > PROJETO.PROJETO_IDENT_CODIGO CodigoProjeto, > PROJETO.PROJETO_IDENT_NOME NomeProjeto, > BENEFICIARIO.BENEFICIARIO_IDENT_PROCADM NumeroProcesso, > LOTE.beneficiario_lote_numero NumeroLote, > SEXO.sexo_codigo CodigoSexo, > SEXO.sexo_descricao Sexo, > BENEFICIARIO.BENEFICIARIO_IDENT_DTNASC DataNascimento, > BENEFICIARIO.BENEFICIARIO_IDENT_DTATUALIZA DataAtualizacao, > SITUACAO.BENEFICIARIO_TIPOSIT_CODIGO CodigoSituacao, > SITUACAO.BENEFICIARIO_TIPOSIT_DESC Situacao, > ASSENTAMENTO.BENEFICIARIO_ASSENT_SIT_DATA DataSituacao, > BENEFICIARIO.BENEFICIARIO_IDENT_DTHOMOLOG DataAssentado, > CASE WHEN DAP_GERADA.Cod_DAP IS NOT NULL THEN 'SIM' ELSE 'NÃO' END PossuiDAP, > DAP_GERADA.Cod_DAP CodigoDAP, > DAP_GERADA.ID_dap_gerada DAPGerada, > DAP_GERADA.DAP_grupo DAPGrupo, > DAP_GERADA.DAP_modelo DAPModelo, > SR.sr_codigo CodigoSR, > SR.sr_nome NomeSR, > UF.COUF CodigoUF, > UF.NOUF NomeUF, > MUNICIPIO.COMUNIBGE CodigoIBGE, > MUNICIPIO.NOMUN Municipio, > PROJETOCOMPLEMENTO.Area Area, > PROJETOCOMPLEMENTO.Capacidade Capacidade,
[oracle_br] Re: Consulta SQL
Se entendi direito o que vc quer fazer a resposta seria algo assim: SELECT P.ID_PLANO,COUNT(U.ID_USUARIO) FROM USUARIO U, PLANOS_CONTRATO PC, PLANOS P WHERE PC.ID_PLANO_CONTRATO=U.ID_PLANO_CONTRATO AND PC.ID_PLANO=P.ID_PLANO GROUP BY P.ID_PLANO --- Em oracle_br@yahoogrupos.com.br, "Haroldo Gondim Torres Filho" <[EMAIL PROTECTED]> escreveu > > Olá pessoal, sou novo aqui no grupo > > alguém poderia me ajudar a fazer uma consulta > > a estrutura e mais ou menos assim > > tabela usuario [id_usuario, id_plano_contrato] > tabela planos_contrato [plano_contrato, id_plano] > tabela planos[id_plano, descricao] > > possui outros atributos, + acho que não influenciem > > > o que eu preciso é a quantidade de usuários por plano >
[oracle_br] Re: Consulta SQL
Haroldo, ficaria assim: select count(u.id_usuario),p.id_plano from usuario u inner join planos_contrato pc on (u.plano_contrato=pc.plano_contrato) inner join planos p on (pc.id_plano=p.plano) group by p.plano no caso acima, estamos utilizando inner join, pois queremos apeas usuários com plano ok? Espero ter ajudado :) --- Em oracle_br@yahoogrupos.com.br, "Haroldo Gondim Torres Filho" <[EMAIL PROTECTED]> escreveu > > Olá pessoal, sou novo aqui no grupo > > alguém poderia me ajudar a fazer uma consulta > > a estrutura e mais ou menos assim > > tabela usuario [id_usuario, id_plano_contrato] > tabela planos_contrato [plano_contrato, id_plano] > tabela planos[id_plano, descricao] > > possui outros atributos, + acho que não influenciem > > > o que eu preciso é a quantidade de usuários por plano >