Re: [oracle_br] Re: CLUSTERING FACTOR
Sim, as coisas vão ficando mais claras pra mim. Obrigada pela indicação do livro Oracle SQL High-Performance, vou atrás hoje mesmo. Obrigada pelos esclarecimentos, fizeram diferença pra minha visão do problema. Abss, De: oracle_br@yahoogrupos.com.br <oracle_br@yahoogrupos.com.br> em nome de jlchia...@yahoo.com.br [oracle_br] <oracle_br@yahoogrupos.com.br> Enviado: terça-feira, 19 de dezembro de 2017 06:37 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: CLUSTERING FACTOR Sim : inclusive, clustering factor *** NÂO TEM NADA A VER *** com redução de I/O per se : ele é simplesmente um indicador, uma referência se os dados dentro do índice estão bastante 'espalhados' por múltiplos blocos ou não, e é usado como fator de DESEMPATE para o Otimizador escolher quando houver mais de um índice possível... E Imagino que vc ENTENDEU quando eu disse que o CF é uma medida de organização da tabela, se fisicamente a tabela está organizada mais coerentemente com a coluna X , não tem ao mesmo tempo como ela Também estar organizada fisicamente pela coluna Y ao mesmo tempoNÃO EXISTE isso de 'melhorar o clustering factor para a query' , o CF é PARA A TABELA COMO UM TODO, okdoc Então SIM, eu Recomendo que vc parte pras opções de Tuning de SQL : via de regra tuning de SQL é muuito mais simples e mito mais Efetivo, vc consegue resultados melhores de uma maneira mais simples... O passo inicial para tuning de SQL é obter Conhecimento sobre os índices E as tabelas envolvidas na query (o que inclui a razão / regra de negócio que te leva a sub-queries, por exemplo), TEM que saber os volumes estimados para cada acesso via cada índice E tem que conhecer os métodos de JOIn (ie, HASH JOIN, NESTED LOOPs, SORT_mERGE, etc) para poder avaliar o Plano de Execução que o Otimizador vai te dar e validar se ele está o mais otimizado possível ou não... Por exemplo, pegando o exemplo em www.oracle..com/technetwork/database/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf o Otimizador escolher fazer um HASH JOIN, ie, ler na íntegra as tabelas envolvidas criando uma tabela temporária em memória ordenada e então filtrar os dados por essas tabelas temporárias - isso é RADICALMENTE DIFERENTE de NESTED LOOP, onde ele vai lendo os dados linha a linha e para cada linha lida o RDBMS procura nas outrs tabelas pra ver se tem um valor correspondente Qual o melhor/mais correto ? DEPENDE dessas infos que citei Na minha experiência pessoal, a fonte que melhor explicou esses diferentes métodos de JOIN foi o livro "Oracle SQL High-Performance Tuning", de Guy Harrison , Recomendo que vc o leia... O passo inicial do método para Tuning de SQL que recomendo portanto é : COM o conhecimento teórico da metodologia do Otimizador de SQL presente E conhecendo também volumes e distribuição de dados nas tabelas e índices envolvidas, obtenha o Plano de Execução extendido (ie, que inclui qtdades estimadas versus qtdades efetivamente obtidas) cfrme https://blogs.oracle.com/optimizer/how-do-i-know-if-the-cardinality-estimates-in-a-plan-are-accurate Com isso aí vc vai analisar se o índice e o método de JOIN tão apropriados ou se vc acredita que outro seria mais efetivo, se as Estatísticas que guiam as Estimativas do RDBMS tão apropriadas, é por aí []s Chiappa
[oracle_br] Re: CLUSTERING FACTOR
Sim : inclusive, clustering factor *** NÂO TEM NADA A VER *** com redução de I/O per se : ele é simplesmente um indicador, uma referência se os dados dentro do índice estão bastante 'espalhados' por múltiplos blocos ou não, e é usado como fator de DESEMPATE para o Otimizador escolher quando houver mais de um índice possível... E Imagino que vc ENTENDEU quando eu disse que o CF é uma medida de organização da tabela, se fisicamente a tabela está organizada mais coerentemente com a coluna X , não tem ao mesmo tempo como ela Também estar organizada fisicamente pela coluna Y ao mesmo tempoNÃO EXISTE isso de 'melhorar o clustering factor para a query' , o CF é PARA A TABELA COMO UM TODO, okdoc Então SIM, eu Recomendo que vc parte pras opções de Tuning de SQL : via de regra tuning de SQL é muuito mais simples e mito mais Efetivo, vc consegue resultados melhores de uma maneira mais simples... O passo inicial para tuning de SQL é obter Conhecimento sobre os índices E as tabelas envolvidas na query (o que inclui a razão / regra de negócio que te leva a sub-queries, por exemplo), TEM que saber os volumes estimados para cada acesso via cada índice E tem que conhecer os métodos de JOIn (ie, HASH JOIN, NESTED LOOPs, SORT_mERGE, etc) para poder avaliar o Plano de Execução que o Otimizador vai te dar e validar se ele está o mais otimizado possível ou não... Por exemplo, pegando o exemplo em www.oracle.com/technetwork/database/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf o Otimizador escolher fazer um HASH JOIN, ie, ler na íntegra as tabelas envolvidas criando uma tabela temporária em memória ordenada e então filtrar os dados por essas tabelas temporárias - isso é RADICALMENTE DIFERENTE de NESTED LOOP, onde ele vai lendo os dados linha a linha e para cada linha lida o RDBMS procura nas outrs tabelas pra ver se tem um valor correspondente Qual o melhor/mais correto ? DEPENDE dessas infos que citei Na minha experiência pessoal, a fonte que melhor explicou esses diferentes métodos de JOIN foi o livro "Oracle SQL High-Performance Tuning", de Guy Harrison , Recomendo que vc o leia... O passo inicial do método para Tuning de SQL que recomendo portanto é : COM o conhecimento teórico da metodologia do Otimizador de SQL presente E conhecendo também volumes e distribuição de dados nas tabelas e índices envolvidas, obtenha o Plano de Execução extendido (ie, que inclui qtdades estimadas versus qtdades efetivamente obtidas) cfrme https://blogs.oracle.com/optimizer/how-do-i-know-if-the-cardinality-estimates-in-a-plan-are-accurate Com isso aí vc vai analisar se o índice e o método de JOIN tão apropriados ou se vc acredita que outro seria mais efetivo, se as Estatísticas que guiam as Estimativas do RDBMS tão apropriadas, é por aí []s Chiappa
[oracle_br] Re: CLUSTERING FACTOR
Bom dia Pessoal, Obrigada jlchiappa pelo retorno. Estou em processo de desenvolvimento nesta parte de tuning. Desculpe se não fui clara o suficiente com as informações necessárias. 1.Coloquei na mensagem anterior a tabela com essas informações. SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS GB ROWS TB_ESTOQUE_ENTRADA2 TABLE 5.438.208 850 41,49 414.612.027 Average rows per data block= 193 2. Sim, a tabela possui muitas colunas. Então, para diminuir o I/O desta query nesta tabela, seria melhor encontrar outras formas como o Particionamento,compressão,tabela em cluster do que melhorar o CF? ---Em oracle_br@yahoogrupos.com.br,escreveu: Bom, primero pergunto, quanto é 400KK - seria 400 mil milhares, ie, 400 milhões ?? E segundo sorry, mas NÚMERO DE LINHAS não é significativo pra gente isoladamente - esse X de linhas representa QUANTOS BYTES/megabytes/gigabytes efetivamente ?? E terceiro ponto, como está a Média de linhas por bloco físico nessa tabela ? Mas de qquer maneira : a primeira coisa que TENHO que observar é que o CLUSTER FACTOR é relacionado com a localização Física dos dados indexados na tabela : Obviamente, não tem como Fisicamente a mesma tabela ter os dados ordenados pela coluna X ** e ** pela coluna Y ao mesmo tempo, então fique CIENTE que se vc alterar/melhorar o cluster factor da tabela em relação a um índice A, muito certamente vc vai PIORAR em relação a um índice B... Lógico Julgando por esse nome de IN_ESTENTRADA_LOTEAPRES2 , me parece que esse Não É o único índice dessa tabela, então VEJA LÁ se mexendo no CF de um ídnice vc Não Estraga o de outro índice, usado por OUTRAs Consultas Legal ?? Isso posto, aí sim a sua resposta... Primeiro teste, cfrme http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52asktom-1735913.html e https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:9524251800346726054 (e os links deste último) demonstram sim, para vc alterar o CF é fisicamente recriar a tabela Tenta em primeiro lugar ao invés de TRUNCAR a tabela e reinserir os dados (o que vai reaproveitar o mesmo segmento MAS adicionando novos extents) criar uma NOVA tabela (chame de TAB_ORGANIZED) com os dados vindos da tabela em análise ordenados num CREATE TABLE AS SELECT e depois criando um índice , como mostrado no primeiro link... Pra ser mais seguro ainda, faça isso numa tablespace LMT com gerenciamento automático... ==> SE esse teste não resultar em alteração nenhuma do CF a gente começa a suspeitar de algum atributo físico que esteja 'forçando' os dados a se espalhar por N blocos : talvez um registro lógico extenso ?? Montes e montes de colunas na tabela em questão ?? OBVIAMENTE, se os dados não couberem com mita folga dentro do bloco, algum tipo de row chaining/row migration vai ser quase certo, aí o CF vai pras picas... []s Chiappa
Re: [oracle_br] Re: CLUSTERING FACTOR
Exatamente pessoal, estou de acordo com voces. O chamado com a SAP ja esta aberto, e so alteramos algo com a autorizacao da SAP. Chiappa, realizei o que vc me pediu, mas nao obtive sucesso, o plano de execucao soh me mostra o E-rows. Alterei o parametro a nivel de sessao. Note- - Warning: basic plan statistics not available. These are only collected when: * hint 'gather_plan_statistics' is used for the statement or * parameter 'statistics_level' is set to 'ALL', at session or system level 51 rows selected. SQL> show parameter statistics_level NAME TYPE VALUE --- --statistics_level string ALL Em Sexta-feira, 15 de Dezembro de 2017 14:58, "jlchia...@yahoo.com.br [oracle_br]"escreveu: Bom, primero pergunto, quanto é 400KK - seria 400 mil milhares, ie, 400 milhões ?? E segundo sorry, mas NÚMERO DE LINHAS não é significativo pra gente isoladamente - esse X de linhas representa QUANTOS BYTES/megabytes/gigabytes efetivamente ?? E terceiro ponto, como está a Média de linhas por bloco físico nessa tabela ? Mas de qquer maneira : a primeira coisa que TENHO que observar é que o CLUSTER FACTOR é relacionado com a localização Física dos dados indexados na tabela : Obviamente, não tem como Fisicamente a mesma tabela ter os dados ordenados pela coluna X ** e ** pela coluna Y ao mesmo tempo, então fique CIENTE que se vc alterar/melhorar o cluster factor da tabela em relação a um índice A, muito certamente vc vai PIORAR em relação a um índice B... Lógico Julgando por esse nome de IN_ESTENTRADA_LOTEAPRES2 , me parece que esse Não É o único índice dessa tabela, então VEJA LÁ se mexendo no CF de um ídnice vc Não Estraga o de outro índice, usado por OUTRAs Consultas Legal ?? Isso posto, aí sim a sua resposta... Primeiro teste, cfrme http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52asktom-1735913.html e https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:9524251800346726054 (e os links deste último) demonstram sim, para vc alterar o CF é fisicamente recriar a tabela Tenta em primeiro lugar ao invés de TRUNCAR a tabela e reinserir os dados (o que vai reaproveitar o mesmo segmento MAS adicionando novos extents) criar uma NOVA tabela (chame de TAB_ORGANIZED) com os dados vindos da tabela em análise ordenados num CREATE TABLE AS SELECT e depois criando um índice , como mostrado no primeiro link... Pra ser mais seguro ainda, faça isso numa tablespace LMT com gerenciamento automático... ==> SE esse teste não resultar em alteração nenhuma do CF a gente começa a suspeitar de algum atributo físico que esteja 'forçando' os dados a se espalhar por N blocos : talvez um registro lógico extenso ?? Montes e montes de colunas na tabela em questão ?? OBVIAMENTE, se os dados não couberem com mita folga dentro do bloco, algum tipo de row chaining/row migration vai ser quase certo, aí o CF vai pras picas... []s Chiappa #yiv2246574670 #yiv2246574670 -- #yiv2246574670ygrp-mkp {border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv2246574670 #yiv2246574670ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv2246574670 #yiv2246574670ygrp-mkp #yiv2246574670hd {color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;}#yiv2246574670 #yiv2246574670ygrp-mkp #yiv2246574670ads {margin-bottom:10px;}#yiv2246574670 #yiv2246574670ygrp-mkp .yiv2246574670ad {padding:0 0;}#yiv2246574670 #yiv2246574670ygrp-mkp .yiv2246574670ad p {margin:0;}#yiv2246574670 #yiv2246574670ygrp-mkp .yiv2246574670ad a {color:#ff;text-decoration:none;}#yiv2246574670 #yiv2246574670ygrp-sponsor #yiv2246574670ygrp-lc {font-family:Arial;}#yiv2246574670 #yiv2246574670ygrp-sponsor #yiv2246574670ygrp-lc #yiv2246574670hd {margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;}#yiv2246574670 #yiv2246574670ygrp-sponsor #yiv2246574670ygrp-lc .yiv2246574670ad {margin-bottom:10px;padding:0 0;}#yiv2246574670 #yiv2246574670actions {font-family:Verdana;font-size:11px;padding:10px 0;}#yiv2246574670 #yiv2246574670activity {background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv2246574670 #yiv2246574670activity span {font-weight:700;}#yiv2246574670 #yiv2246574670activity span:first-child {text-transform:uppercase;}#yiv2246574670 #yiv2246574670activity span a {color:#5085b6;text-decoration:none;}#yiv2246574670 #yiv2246574670activity span span {color:#ff7900;}#yiv2246574670 #yiv2246574670activity span .yiv2246574670underline {text-decoration:underline;}#yiv2246574670 .yiv2246574670attach {clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;}#yiv2246574670 .yiv2246574670attach div a {text-decoration:none;}#yiv2246574670 .yiv2246574670attach img
[oracle_br] Re: CLUSTERING FACTOR
Bom, primero pergunto, quanto é 400KK - seria 400 mil milhares, ie, 400 milhões ?? E segundo sorry, mas NÚMERO DE LINHAS não é significativo pra gente isoladamente - esse X de linhas representa QUANTOS BYTES/megabytes/gigabytes efetivamente ?? E terceiro ponto, como está a Média de linhas por bloco físico nessa tabela ? Mas de qquer maneira : a primeira coisa que TENHO que observar é que o CLUSTER FACTOR é relacionado com a localização Física dos dados indexados na tabela : Obviamente, não tem como Fisicamente a mesma tabela ter os dados ordenados pela coluna X ** e ** pela coluna Y ao mesmo tempo, então fique CIENTE que se vc alterar/melhorar o cluster factor da tabela em relação a um índice A, muito certamente vc vai PIORAR em relação a um índice B... Lógico Julgando por esse nome de IN_ESTENTRADA_LOTEAPRES2 , me parece que esse Não É o único índice dessa tabela, então VEJA LÁ se mexendo no CF de um ídnice vc Não Estraga o de outro índice, usado por OUTRAs Consultas Legal ?? Isso posto, aí sim a sua resposta... Primeiro teste, cfrme http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52asktom-1735913.html e https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:9524251800346726054 (e os links deste último) demonstram sim, para vc alterar o CF é fisicamente recriar a tabela Tenta em primeiro lugar ao invés de TRUNCAR a tabela e reinserir os dados (o que vai reaproveitar o mesmo segmento MAS adicionando novos extents) criar uma NOVA tabela (chame de TAB_ORGANIZED) com os dados vindos da tabela em análise ordenados num CREATE TABLE AS SELECT e depois criando um índice , como mostrado no primeiro link... Pra ser mais seguro ainda, faça isso numa tablespace LMT com gerenciamento automático... ==> SE esse teste não resultar em alteração nenhuma do CF a gente começa a suspeitar de algum atributo físico que esteja 'forçando' os dados a se espalhar por N blocos : talvez um registro lógico extenso ?? Montes e montes de colunas na tabela em questão ?? OBVIAMENTE, se os dados não couberem com mita folga dentro do bloco, algum tipo de row chaining/row migration vai ser quase certo, aí o CF vai pras picas... []s Chiappa