{"id":1144,"date":"2017-10-06T11:07:10","date_gmt":"2017-10-06T14:07:10","guid":{"rendered":"http:\/\/dbtimewizard.com.br\/blog\/?p=1144"},"modified":"2019-11-11T18:48:47","modified_gmt":"2019-11-11T21:48:47","slug":"o-que-voce-precisa-saber-sobre-o-uso-de-indices","status":"publish","type":"post","link":"http:\/\/dbtimewizard.com.br\/blog\/o-que-voce-precisa-saber-sobre-o-uso-de-indices\/","title":{"rendered":"O que voc\u00ea precisa saber sobre o uso de \u00edndices?"},"content":{"rendered":"<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Existem muitos artigos na internet afirmando que a partir de um certo percentual de registros acessados em uma tabela o Otimizador do Oracle prefere utilizar uma opera\u00e7\u00e3o TABLE ACCESS FULL, este percentual na verdade n\u00e3o existe, para definir o tipo de opera\u00e7\u00e3o que vai utilizar, o Otimizador se baseia em uma s\u00e9rie de informa\u00e7\u00f5es que combinadas v\u00e3o determinar o tipo de opera\u00e7\u00e3o mais eficiente, neste artigo vamos abordar um destes fatores que tem um peso muito grande na tomada de decis\u00e3o pelo Otimizador. Vamos entender a import\u00e2ncia da estat\u00edstica CLUSTERING FACTOR e ver na pr\u00e1tica como ela determina que a leitura\u00a0 de 1% dos registros de uma tabela pode ser mais eficiente\u00a0tanto para uma opera\u00e7\u00e3o INDEX RANGE SCAN\u00a0como para uma opera\u00e7\u00e3o de TABLE ACCESS FULL.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para realizar esta simula\u00e7\u00e3o vamos:<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">1) Criar duas tabelas para realizar as simula\u00e7\u00f5es<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">2) Executar uma consulta na primeira tabela contando o numero de registros existentes para um determinado valor da coluna RESULT<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">3) Apresentar os c\u00e1lculos que o Otimizador realizou para escolher o acesso a tabela utilizando a opera\u00e7\u00e3o TABLE ACCESS FULL<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">4) Executar uma consulta na segunda tabela contando o numero de registros existentes para um determinado valor da coluna RESULT<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">5) Apresentar os c\u00e1lculos que o Otimizador realizou para escolher o acesso a tabela utilizando a opera\u00e7\u00e3o INDEX RANGE SCAN<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">1) Criar as tabelas para as simula\u00e7\u00f5es<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Vamos criar uma tabela com 10.000.000 de registros, sendo que a coluna RESULT possui somente 100 valores distintos e uma segunda tabela\u00a0clone da\u00a0primeira classificando os registros pela coluna RESULT.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span> FROM V<span class=\"re0\">$VERSION<\/span> where rownum <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nBANNER<br \/>\n<span class=\"sy0\">--------------------------------------------------------------------------------<\/span><br \/>\nOracle Database 11g Enterprise Edition Release 11<span class=\"sy0\">.<\/span>2<span class=\"sy0\">.<\/span>0<span class=\"sy0\">.<\/span>4<span class=\"sy0\">.<\/span>0 <span class=\"sy0\">-<\/span> 64bit Production<br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.04<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> ALTER SESSION SET WORKAREA_SIZE_POLICY<span class=\"sy0\">=<\/span>MANUAL<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSess\u00e3o alterada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.01<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> ALTER SESSION SET SORT_AREA_SIZE<span class=\"sy0\">=<\/span><span class=\"nu0\">2000000000<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSess\u00e3o alterada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.01<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create table dbtw101 <span class=\"br0\">&#40;<\/span>id <span class=\"sy0\">,<\/span> result<span class=\"sy0\">,<\/span> text <span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp; &nbsp;<span class=\"kw1\">as<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; &nbsp; &nbsp;select rownum<span class=\"sy0\">,<\/span> mod<span class=\"br0\">&#40;<\/span>rownum<span class=\"sy0\">,<\/span> <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'DBTimeWizard - Performance and Tuning'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; &nbsp; &nbsp;from dual connect by level <span class=\"sy0\">&lt;=<\/span> <span class=\"nu0\">10000000<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTabela criada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">12.84<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create index dbtw01_idx on dbtw101<span class=\"br0\">&#40;<\/span>result<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n\u00cdndice criado<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">14.18<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <a href=\"http:\/\/www.php.net\/exec\"><span class=\"kw3\">exec<\/span><\/a> dbms_stats<span class=\"sy0\">.<\/span>gather_table_stats<span class=\"br0\">&#40;<\/span>ownname<span class=\"sy0\">=&gt;<\/span> USER<span class=\"sy0\">,<\/span> tabname<span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'DBTW101'<\/span><span class=\"sy0\">,<\/span> method_opt<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'for all columns size auto'<\/span><span class=\"sy0\">,<\/span>cascade<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span>force<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span>degree<span class=\"sy0\">=&gt;<\/span><span class=\"nu0\">16<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nProcedimento PL<span class=\"sy0\">\/<\/span>SQL conclu\u00ed<span class=\"kw1\">do<\/span> com sucesso<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">26.80<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create table dbtw102 <span class=\"br0\">&#40;<\/span>id <span class=\"sy0\">,<\/span> result<span class=\"sy0\">,<\/span> text <span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp; &nbsp;<span class=\"kw1\">as<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; &nbsp; &nbsp;select <span class=\"sy0\">*<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; &nbsp; &nbsp;from dbtw101<br \/>\n&nbsp; <span class=\"nu0\">5<\/span> &nbsp; &nbsp; &nbsp; order by result<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTabela criada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">16.48<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create index dbtw02_idx on dbtw102<span class=\"br0\">&#40;<\/span>result<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n\u00cdndice criado<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">10.53<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <a href=\"http:\/\/www.php.net\/exec\"><span class=\"kw3\">exec<\/span><\/a> dbms_stats<span class=\"sy0\">.<\/span>gather_table_stats<span class=\"br0\">&#40;<\/span>ownname<span class=\"sy0\">=&gt;<\/span> USER<span class=\"sy0\">,<\/span> tabname<span class=\"sy0\">=&gt;<\/span> <span class=\"st_h\">'DBTW102'<\/span><span class=\"sy0\">,<\/span> method_opt<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'for all columns size auto'<\/span><span class=\"sy0\">,<\/span>cascade<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span>force<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span>degree<span class=\"sy0\">=&gt;<\/span><span class=\"nu0\">16<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nProcedimento PL<span class=\"sy0\">\/<\/span>SQL conclu\u00ed<span class=\"kw1\">do<\/span> com sucesso<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">13.52<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">2) Executar a consulta na primeira tabela<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Agora vamos executar uma consulta na primeira tabela, acessando 1% do numero de linhas dela e verificar que o Otimizador vai escolher acessar a tabela utilizando uma opera\u00e7\u00e3o TABLE ACCESS FULL.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> ALTER SESSION SET statistics_level <span class=\"sy0\">=<\/span> ALL<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSess\u00e3o alterada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.01<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"coMULTI\">\/* DBTW001 *\/<\/span> <a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM dbtw101<br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE result <span class=\"sy0\">=<\/span> <span class=\"nu0\">67<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp;<a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">COUNT<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"sy0\">----------<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu0\">100000<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">16.88<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <span class=\"sy0\">--<\/span> Recupera o SQL_ID e o CHILD_NUMBER &nbsp;da consulta executada<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column sql_id new_value m_sql_id<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column child_number new_value m_child_no<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT sql_id<span class=\"sy0\">,<\/span> child_number<br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM v<span class=\"re0\">$sql<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE sql_text LIKE <span class=\"st_h\">'%DBTW001%'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; AND sql_text NOT LIKE <span class=\"st_h\">'%v$sql%'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSQL_ID &nbsp; &nbsp; &nbsp; &nbsp;CHILD_NUMBER<br \/>\n<span class=\"sy0\">-------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\nd30cb6crgfyx1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">0<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.21<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <span class=\"sy0\">--<\/span> Gera o relat\u00f3rio <span class=\"kw1\">do<\/span> plano de execu\u00e7\u00e3o da consulta<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nantigo &nbsp; <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nnovo &nbsp; <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'d30cb6crgfyx1'<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\nPLAN_TABLE_OUTPUT<br \/>\n<span class=\"sy0\">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\nSQL_ID &nbsp;d30cb6crgfyx1<span class=\"sy0\">,<\/span> child number <span class=\"nu0\">0<\/span><br \/>\n<span class=\"sy0\">-------------------------------------<\/span><br \/>\nSELECT <span class=\"coMULTI\">\/* DBTW001 *\/<\/span> <a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span> &nbsp; FROM dbtw101 &nbsp;WHERE result <span class=\"sy0\">=<\/span> <span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_0&quot;<\/span><br \/>\n<br \/>\nPlan <a href=\"http:\/\/www.php.net\/hash\"><span class=\"kw3\">hash<\/span><\/a> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">3256843722<\/span><br \/>\n<br \/>\n<span class=\"sy0\">---------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> Id &nbsp;<span class=\"sy0\">|<\/span> Operation &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> Name &nbsp; &nbsp;<span class=\"sy0\">|<\/span> Starts <span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span>E<span class=\"sy0\">-<\/span>Bytes<span class=\"sy0\">|<\/span> Cost <span class=\"br0\">&#40;<\/span><span class=\"sy0\">%<\/span>CPU<span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> A<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span> &nbsp; A<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> Buffers <span class=\"sy0\">|<\/span> Reads &nbsp;<span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">0<\/span> <span class=\"sy0\">|<\/span> SELECT STATEMENT &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2466<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">16.84<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">71843<\/span> <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">71839<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp;<a href=\"http:\/\/www.php.net\/sort\"><span class=\"kw3\">SORT<\/span><\/a> <a href=\"http:\/\/www.php.net\/aggregate\"><span class=\"kw3\">AGGREGATE<\/span><\/a> &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">9<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">16.84<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">71843<\/span> <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">71839<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|*<\/span> &nbsp;<span class=\"nu0\">2<\/span> <span class=\"sy0\">|<\/span> &nbsp; TABLE ACCESS FULL<span class=\"sy0\">|<\/span> DBTW101 <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;100K<span class=\"sy0\">|<\/span> &nbsp; 878K<span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2466<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">9<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;100K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">16.84<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">71843<\/span> <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">71839<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<br \/>\nPredicate Information <span class=\"br0\">&#40;<\/span>identified by operation id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2<\/span> <span class=\"sy0\">-<\/span> filter<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;RESULT&quot;<\/span><span class=\"sy0\">=:<\/span>SYS_B_0<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"nu0\">19<\/span> linhas selecionadas<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.71<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 14pt;\">3) Verificar c\u00e1lculos utilizados pelo Otimizador<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Na primeira tabela o CLUSTERING FACTOR do \u00edndice da tabela \u00e9 muito ruim, o valor \u00e9 bem pr\u00f3ximo do numero total de linhas da tabela\u00a07.287.656, isso faz com que a recupera\u00e7\u00e3o de linhas da tabela utilizando \u00edndice cause um volume de acesso a bloco de dados muito alto, inviabilizando a utiliza\u00e7\u00e3o do \u00edndice.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Na figura abaixo temos uma representa\u00e7\u00e3o gr\u00e1fica de um CLUSTERING FACTOR ruim, podemos observar que os blocos de \u00edndices est\u00e3o totalmente desorganizados em rela\u00e7\u00e3o aos blocos de dados, nesta situa\u00e7\u00e3o as linhas com um determinado valor para uma coluna referenciada no \u00edndice podem estar espalhadas em v\u00e1rios blocos da tabela tornando o acesso com o uso do \u00edndice muito caro.<\/span><\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1149\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF2.jpg\" alt=\"CF2\" width=\"1280\" height=\"720\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-size: 12pt;\">C\u00e1lculos para acessar a tabela usando \u00edndice<\/span><\/h3>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> select INDEX_NAME<span class=\"sy0\">,<\/span> blevel<span class=\"sy0\">,<\/span> num_rows<span class=\"sy0\">,<\/span> distinct_keys<span class=\"sy0\">,<\/span> CLUSTERING_FACTOR<span class=\"sy0\">,<\/span> LEAF_BLOCKS from dba_indexes where table_name <span class=\"sy0\">=<\/span> <span class=\"st_h\">'DBTW101'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nINDEX_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BLEVEL &nbsp; NUM_ROWS DISTINCT_KEYS CLUSTERING_FACTOR LEAF_BLOCKS<br \/>\n<span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">----------<\/span> <span class=\"sy0\">----------<\/span> <span class=\"sy0\">-------------<\/span> <span class=\"sy0\">-----------------<\/span> <span class=\"sy0\">-----------<\/span><br \/>\nDBTW01_IDX &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">2<\/span> &nbsp; <span class=\"nu0\">10139378<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">100<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">7287656<\/span> &nbsp; &nbsp; &nbsp; <span class=\"nu0\">19794<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> linha selecionada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.82<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT TABLE_NAME<span class=\"sy0\">,<\/span> COLUMN_NAME<span class=\"sy0\">,<\/span> DENSITY FROM dba_tab_col_statistics WHERE table_name <span class=\"sy0\">=<\/span> <span class=\"st_h\">'DBTW101'<\/span> AND COLUMN_NAME<span class=\"sy0\">=<\/span><span class=\"st_h\">'RESULT'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTABLE_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COLUMN_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DENSITY<br \/>\n<span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\nDBTW101 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;RESULT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu19\">.010000000<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> linha selecionada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.18<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\nFormula para calcular custo da opera\u00e7\u00e3o leitura <span class=\"kw1\">do<\/span> indice<span class=\"sy0\">:<\/span><br \/>\n<br \/>\nBLEVEL <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span>LEAF BLOCKS X DENSITY<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">19794<\/span> X <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu8\">01<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">198<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">200<\/span><br \/>\n<br \/>\nFormula para calcular custo da opera\u00e7\u00e3o leitura da tabela pelo rowid<span class=\"sy0\">:<\/span><br \/>\n<br \/>\nDENSITY <span class=\"sy0\">*<\/span> CLUSTERING_FACTOR <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">7287656<\/span> <span class=\"sy0\">=<\/span> &nbsp;<span class=\"nu19\">72.876<\/span><br \/>\n<br \/>\nCUSTO <span class=\"kw1\">DO<\/span> ACESSO A TABELA UTILIZANDO \u00cdNDICE <span class=\"sy0\">=<\/span> <span class=\"nu0\">200<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu19\">72.876<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu19\">73.006<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Na primeira consulta realizada acima o Otimizador escolheu fazer uma opera\u00e7\u00e3o TABLE ACCESS FULL pois o custo dessa opera\u00e7\u00e3o era menor que o da opera\u00e7\u00e3o INDEX RANGE SCAN. Nas formulas acima aplicando-se os valores estat\u00edsticos da tabela e do \u00edndice, verificamos que o custo total para acessar as linhas solicitadas pela consulta seria 73.006.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 10pt;\">Obs: As formulas acima s\u00e3o aplicadas pelo Otimizador quando a consulta \u00e9 realizada em apenas uma tabela e somente um filtro na cl\u00e1usula WHERE, se a consulta for um join de duas ou mais tabelas e\/ou houverem mais filtros na cl\u00e1usula WHERE o Otimizador utilizar\u00e1 outras formulas.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-size: 12pt;\">C\u00e1lculos para acessar a tabela usando TABLE ACCESS FULL<\/span><\/h3>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> select NUM_ROWS<span class=\"sy0\">,<\/span> BLOCKS FROM DBA_TABLES WHERE TABLE_NAME <span class=\"sy0\">=<\/span> <span class=\"st_h\">'DBTW101'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; NUM_ROWS &nbsp; &nbsp; BLOCKS <br \/>\n<span class=\"sy0\">----------<\/span> <span class=\"sy0\">----------<\/span> <br \/>\n&nbsp; <span class=\"nu0\">10000000<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">72226<\/span> <br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> linha selecionada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">01.18<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span> FROM SYS<span class=\"sy0\">.<\/span>AUX_STATS$<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSNAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PNAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PVAL1 PVAL2<br \/>\n<span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">----------<\/span> <span class=\"sy0\">------------------------------<\/span><br \/>\nSYSSTATS_INFO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STATUS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;COMPLETED<br \/>\nSYSSTATS_INFO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DSTART &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu19\">09<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">29<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">2017<\/span> <span class=\"nu0\">21<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">51<\/span><br \/>\nSYSSTATS_INFO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DSTOP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu19\">09<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">29<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">2017<\/span> <span class=\"nu0\">21<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">51<\/span><br \/>\nSYSSTATS_INFO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FLAGS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">1<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CPUSPEEDNW &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">3074<\/span><span class=\"sy0\">,<\/span><span class=\"nu8\">07407<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IOSEEKTIM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">10<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IOTFRSPEED &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">4096<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SREADTIM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">5<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MREADTIM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">10<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CPUSPEED &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">2618<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MBRC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">64<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MAXTHR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">262144<\/span><br \/>\nSYSSTATS_MAIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SLAVETHR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">16384<\/span><br \/>\n<br \/>\n<span class=\"nu0\">13<\/span> linhas selecionadas<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.15<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\nFormula para calcular custo da opera\u00e7\u00e3o leitura da tabela <span class=\"br0\">&#40;<\/span>TABLE ACCESS FULL<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<br \/>\nTOTAL BLOCKS <span class=\"sy0\">\/<\/span> MBRC <span class=\"sy0\">*<\/span> <span class=\"br0\">&#40;<\/span>MREADTIM<span class=\"sy0\">\/<\/span>SREADTIM<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">72226<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">64<\/span> <span class=\"sy0\">*<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">10<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">5<\/span><span class=\"br0\">&#41;<\/span> &nbsp;<span class=\"sy0\">=<\/span> <span class=\"nu0\">2257<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Quando se trata do custo da opera\u00e7\u00e3o TABLE ACCESS FULL, ao contr\u00e1rio da leitura do \u00edndice usando a opera\u00e7\u00e3o INDEX RANGE SCAN, que faz a leitura de um bloco de cada vez, nesta opera\u00e7\u00e3o s\u00e3o feitas leituras de\u00a0 m\u00faltiplos blocos. Na formula acima temos o numero de blocos da tabela dividido pelo MBRC que corresponde a quantidade de blocos acessados em cada leitura multipla. O tempo de leitura de um bloco para Otimizador equivale ao custo 1, como o tempo de leitura de multiplos blocos (MREADTIM) \u00e9 o dobro do tempo da leitura de um bloco (SREADTIM) o Otimizador considerar\u00e1 cada leitura de m\u00faltiplos blocos com o custo 2. Como resultado da formula acima temos um custo de 2.257 que \u00e9 muito inferior ao custo da leitura utilizando \u00edndice 73.006, por isto o Otimizador escolheu fazer a leitura da tabela utilizando a opera\u00e7\u00e3o TABLE ACCESS FULL.<\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">4) Executar a consulta na\u00a0segunda tabela<\/span><\/h2>\n<p style=\"text-align: justify;\">Agora vamos executar uma consulta na\u00a0segunda tabela que \u00e9 um clone da primeira, acessando os mesmos 1% de linhas dela e verificar que o Otimizador desta vez vai\u00a0 escolher acessar a tabela utilizando\u00a0a opera\u00e7\u00e3o INDEX RANGE SCAN.<\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> ALTER SESSION SET statistics_level <span class=\"sy0\">=<\/span> ALL<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSess\u00e3o alterada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.00<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"coMULTI\">\/* DBTW002 *\/<\/span> <a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM dbtw102<br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE result <span class=\"sy0\">=<\/span> <span class=\"nu0\">67<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp;<a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">COUNT<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"sy0\">----------<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu0\">100000<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.82<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <span class=\"sy0\">--<\/span> Recupera o SQL_ID e o CHILD_NUMBER &nbsp;da consulta executada<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column sql_id new_value m_sql_id<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column child_number new_value m_child_no<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT sql_id<span class=\"sy0\">,<\/span> child_number<br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM v<span class=\"re0\">$sql<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE sql_text LIKE <span class=\"st_h\">'%DBTW002%'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; AND sql_text NOT LIKE <span class=\"st_h\">'%v$sql%'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSQL_ID &nbsp; &nbsp; &nbsp; &nbsp;CHILD_NUMBER<br \/>\n<span class=\"sy0\">-------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\n1fagpjtw47nfm &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">0<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.08<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <span class=\"sy0\">--<\/span> Gera o relat\u00f3rio <span class=\"kw1\">do<\/span> plano de execu\u00e7\u00e3o da consulta<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nantigo &nbsp; <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nnovo &nbsp; <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span> SELECT <span class=\"sy0\">*<\/span> FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'1fagpjtw47nfm'<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\nPLAN_TABLE_OUTPUT<br \/>\n<span class=\"sy0\">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\nSQL_ID &nbsp;1fagpjtw47nfm<span class=\"sy0\">,<\/span> child number <span class=\"nu0\">0<\/span><br \/>\n<span class=\"sy0\">-------------------------------------<\/span><br \/>\nSELECT <span class=\"coMULTI\">\/* DBTW002 *\/<\/span> <a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span>ID<span class=\"br0\">&#41;<\/span> &nbsp; FROM dbtw102 &nbsp;WHERE result <span class=\"sy0\">=<\/span> <span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_0&quot;<\/span><br \/>\n<br \/>\nPlan <a href=\"http:\/\/www.php.net\/hash\"><span class=\"kw3\">hash<\/span><\/a> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">2285397273<\/span><br \/>\n<br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> Id &nbsp;<span class=\"sy0\">|<\/span> Operation &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> Name &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> Starts <span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span>E<span class=\"sy0\">-<\/span>Bytes<span class=\"sy0\">|<\/span> Cost <span class=\"br0\">&#40;<\/span><span class=\"sy0\">%<\/span>CPU<span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> A<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span> &nbsp; A<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> Buffers <span class=\"sy0\">|<\/span> Reads &nbsp;<span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">0<\/span> <span class=\"sy0\">|<\/span> SELECT STATEMENT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">1115<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.81<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">918<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">917<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp;<a href=\"http:\/\/www.php.net\/sort\"><span class=\"kw3\">SORT<\/span><\/a> <a href=\"http:\/\/www.php.net\/aggregate\"><span class=\"kw3\">AGGREGATE<\/span><\/a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">9<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.81<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">918<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">917<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">2<\/span> <span class=\"sy0\">|<\/span> &nbsp; TABLE ACCESS BY INDEX ROWID<span class=\"sy0\">|<\/span> DBTW102 &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;100K<span class=\"sy0\">|<\/span> &nbsp; 878K<span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">1115<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;100K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.81<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">918<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">917<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|*<\/span> &nbsp;<span class=\"nu0\">3<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;INDEX <a href=\"http:\/\/www.php.net\/range\"><span class=\"kw3\">RANGE<\/span><\/a> SCAN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> DBTW02_IDX <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;101K<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">201<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;100K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.21<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">199<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">198<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<br \/>\nPredicate Information <span class=\"br0\">&#40;<\/span>identified by operation id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">3<\/span> <span class=\"sy0\">-<\/span> access<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;RESULT&quot;<\/span><span class=\"sy0\">=:<\/span>SYS_B_0<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"nu0\">20<\/span> linhas selecionadas<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.29<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 14pt;\">5) Verificar c\u00e1lculos utilizados pelo Otimizador<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Na\u00a0segunda tabela o CLUSTERING FACTOR do \u00edndice da tabela \u00e9 muito bom, o valor \u00e9 bem pr\u00f3ximo do numero total de\u00a0blocos da tabela 91.303, isso faz com que um acesso a tabela utilizando \u00edndice\u00a0seja muito eficiente.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Na figura abaixo temos uma representa\u00e7\u00e3o gr\u00e1fica de um CLUSTERING FACTOR muito bom, podemos observar que os blocos de \u00edndices est\u00e3o totalmente organizados em rela\u00e7\u00e3o aos blocos de dados, nesta situa\u00e7\u00e3o os registros com um determinado valor para uma coluna referenciada no \u00edndice estar\u00e3o agrupados em poucos blocos da tabela tornando o acesso \u00e1 tabela com o uso do \u00edndice muito eficiente.<\/span><\/p>\n<p>&nbsp;<br \/>\n<a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1150\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF1.jpg\" alt=\"CF1\" width=\"1280\" height=\"720\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF1.jpg 1280w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF1-300x169.jpg 300w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2017\/10\/CF1-1024x576.jpg 1024w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><br \/>\n&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> select INDEX_NAME<span class=\"sy0\">,<\/span> blevel<span class=\"sy0\">,<\/span> num_rows<span class=\"sy0\">,<\/span> distinct_keys<span class=\"sy0\">,<\/span> CLUSTERING_FACTOR<span class=\"sy0\">,<\/span> LEAF_BLOCKS from dba_indexes where table_name <span class=\"sy0\">=<\/span> <span class=\"st_h\">'DBTW102'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nINDEX_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BLEVEL &nbsp; NUM_ROWS DISTINCT_KEYS CLUSTERING_FACTOR LEAF_BLOCKS<br \/>\n<span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">----------<\/span> <span class=\"sy0\">----------<\/span> <span class=\"sy0\">-------------<\/span> <span class=\"sy0\">-----------------<\/span> <span class=\"sy0\">-----------<\/span><br \/>\nDBTW02_IDX &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">2<\/span> &nbsp; <span class=\"nu0\">10135438<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">100<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">91303<\/span> &nbsp; &nbsp; &nbsp; <span class=\"nu0\">19780<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> linha selecionada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.16<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT TABLE_NAME<span class=\"sy0\">,<\/span> COLUMN_NAME<span class=\"sy0\">,<\/span> DENSITY FROM dba_tab_col_statistics WHERE table_name <span class=\"sy0\">=<\/span> <span class=\"st_h\">'DBTW102'<\/span> AND COLUMN_NAME<span class=\"sy0\">=<\/span><span class=\"st_h\">'RESULT'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTABLE_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COLUMN_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DENSITY<br \/>\n<span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">------------------------------<\/span> <span class=\"sy0\">----------<\/span><br \/>\nDBTW102 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;RESULT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">,<\/span><span class=\"nu8\">01<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> linha selecionada<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nDecorrido<span class=\"sy0\">:<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.27<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\nFormula para calcular custo da opera\u00e7\u00e3o leitura <span class=\"kw1\">do<\/span> indice<span class=\"sy0\">:<\/span><br \/>\n<br \/>\nBLEVEL <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span>LEAF BLOCKS X DENSITY<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">19780<\/span> X <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu8\">01<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">198<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">200<\/span><br \/>\n<br \/>\nFormula para calcular custo da opera\u00e7\u00e3o leitura da tabela pelo rowid<span class=\"sy0\">:<\/span><br \/>\n<br \/>\nDENSITY <span class=\"sy0\">*<\/span> CLUSTERING_FACTOR <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">91303<\/span> <span class=\"sy0\">=<\/span> &nbsp;<span class=\"nu0\">913<\/span><br \/>\n<br \/>\nCUSTO <span class=\"kw1\">DO<\/span> ACESSO A TABELA UTILIZANDO \u00cdNDICE <span class=\"sy0\">=<\/span> <span class=\"nu0\">200<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">913<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu19\">1.113<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Aplicando as formulas do Otimizador e utilizando os valores estat\u00edsticos da tabela e do \u00edndice, verificamos que o custo do acesso utilizando \u00cdNDICE \u00e9 igual 1.113, Um pouco menor do que aparece no plano de execu\u00e7\u00e3o pois neste valor n\u00e3o foi computado o custo CPU.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 14pt;\">Conclus\u00e3o<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Esta \u00e9 uma demonstra\u00e7\u00e3o simples para mostrar que a escolha\u00a0pelo Otimizador da opera\u00e7\u00e3o INDEX RANGE SCAN\u00a0ou a TABLE ACCESS FULL nem sempre depende da porcentagem de linhas que uma consulta deve recuperar. Em vez disso, depende de fatores cr\u00edticos como a distribui\u00e7\u00e3o de dados, o n\u00famero de leaf blocks no \u00edndice, o n\u00famero m\u00e9dio de linhas em um bloco de tabela, o n\u00famero m\u00e9dio de entradas nos leaf blocks do \u00edndice, o clustering factor do \u00edndice e o valor do par\u00e2metro db_file_multiblock_read_count, simplesmente n\u00e3o existe uma porcentagem m\u00e1gica de linhas que fa\u00e7a o Otimizador escolher uma\u00a0opera\u00e7\u00e3o INDEX RANGE SCAN\u00a0ou TABLE ACCESS FULL.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 14pt;\">Refer\u00eancias:<\/span><\/h2>\n<p><span style=\"font-size: 12pt;\"><strong><a href=\"http:\/\/docs.oracle.com\/cd\/E25178_01\/server.1111\/e16638\/optimops.htm#i82433\" target=\"_blank\">http:\/\/docs.oracle.com\/cd\/E25178_01\/server.1111\/e16638\/optimops.htm#i82433<\/a><\/strong><\/span><\/p>\n<p>&nbsp;<br \/>\n&nbsp;<br \/>\n<a href=\"http:\/\/dbtimewizard.com.br\/treinamento\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1255\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2018\/10\/promo_cur02.jpg\" alt=\"Promo-D75L\" width=\"330\" height=\"242\" \/><\/a><\/p>\n<p><a href=\"https:\/\/youtu.be\/l6OphhTle9I\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1215\" src=\"http:\/\/dbtimewizard.com.br\/wp-content\/uploads\/2018\/01\/video-02-300x168.jpg\" alt=\"video-02\" width=\"330\" height=\"242\" \/><\/a><br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existem muitos artigos na internet afirmando que a partir de um certo percentual de registros acessados em uma tabela o Otimizador do Oracle prefere utilizar uma opera\u00e7\u00e3o TABLE ACCESS FULL, este percentual na verdade n\u00e3o existe, para definir o tipo de opera\u00e7\u00e3o que vai utilizar, o Otimizador se baseia em uma s\u00e9rie de informa\u00e7\u00f5es que combinadas v\u00e3o determinar o tipo<\/p>\n","protected":false},"author":2,"featured_media":1143,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62],"tags":[178,82,10,29],"class_list":["post-1144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-indice","tag-clustering-factor","tag-optimizer","tag-otimizador","tag-performance-tuning"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/1144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1144"}],"version-history":[{"count":43,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/1144\/revisions"}],"predecessor-version":[{"id":2081,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/1144\/revisions\/2081"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media\/1143"}],"wp:attachment":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1144"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}