{"id":367,"date":"2013-03-16T10:04:00","date_gmt":"1970-01-01T00:00:00","guid":{"rendered":"http:\/\/www.yazilimmutfagi.com\/?p=367"},"modified":"2013-03-16T10:04:00","modified_gmt":"1970-01-01T00:00:00","slug":"dba-tab-modifications-ve-gather-stats","status":"publish","type":"post","link":"https:\/\/www.yazilimmutfagi.com\/index.php\/2013\/03\/16\/dba-tab-modifications-ve-gather-stats\/","title":{"rendered":"Dba_Tab_Modifications ve Gather_Stats"},"content":{"rendered":"<h2>\n\t<strong>Dba_Tab_Modifications ve Gather_Stats<\/strong><\/h2>\n<p>\n\tTabloya en son gelen insert update zamanlari gerekebilir. Bir tablo ne zamandan beri DML almiyor g&ouml;rmek istenebilir. Bunun i&ccedil;in neler yapilabilir. Dba_tables dict viewdan last_analyzed kolonuna bakilabilir veya DBA_TAB_MODIFICATIONS&nbsp; ( ayni tablonun all ve user versiyonlari da mevcut.) tablosuna bakilabilir. Iste bu yazida bu viewlar hakkinda biraz bilgi sahibi olacagiz, farkli durumlarda son DML bilgisini nasil alacagimizi bulacagiz.<\/p>\n<p>\n\tDML islemleri data &uuml;zerinde degisiklik yaptigindan tablo istatistigini degistirir. Bu durumda tablo &uuml;zerindeki son DML hareketlerini g&ouml;rmek istedigimizde karsimiza iki durum &ccedil;ikacaktir;<\/p>\n<ol>\n\t<li value=\"NaN\">\n\t\tIstatistik aliniyorsa<\/li>\n\t<li value=\"NaN\">\n\t\tIstatistik alinmiyorsa<\/li>\n<\/ol>\n<p>\n\t&Ouml;nemi oldugunu d&uuml;s&uuml;nd&uuml;g&uuml;m&uuml;z bir veritabaninda istatistik alinmali, dolaysiyla sadece istatistik aliniyorsa nasil ilerleyecegimize bakalim.<\/p>\n<p>\n\t&Ouml;ncelikle last_analyzed kolonu yardimci olabilir;<\/p>\n<table class=\"reference\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tTABLE_NAME<\/td>\n\t\t\t<td>\n\t\t\t\tLAST_ANALYZED<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tDENEME<\/td>\n\t\t\t<td>\n\t\t\t\t03.12.2013 19:00:09<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tDENEME1<\/td>\n\t\t\t<td>\n\t\t\t\t05.02.2011 23:06:16<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tDENEME2<\/td>\n\t\t\t<td>\n\t\t\t\t05.02.2011 20:55:55<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tDENEME3<\/td>\n\t\t\t<td>\n\t\t\t\t05.02.2011 20:24:52<\/td>\n\t\t<\/tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tDENEME4<\/td>\n\t\t\t<td>\n\t\t\t\t05.02.2011 20:15:21<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<p>\n\tDENEME1-4 tablolari 20010205&rsquo;ten bu yana hi&ccedil; degismemis &nbsp;g&ouml;r&uuml;n&uuml;yor.&nbsp; Bu sekilde d&uuml;s&uuml;n&uuml;lebilir ama bu bizi yaniltir. &Ccedil;&uuml;nk&uuml; last_analyzed kolonunu gather_stats degistirir. Fakat gather_stast her degisiklikten sonra &ccedil;alismaz. Default olarak degisiklik miktari tablonun row sayisnin %10&rsquo;una ulastiktan sonra &ccedil;alisir. &nbsp;Estimate_percent degerni g&ouml;rmek i&ccedil;in asagidaki query &ccedil;alistirilabilir.<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; select dbms_stats.get_param(&#39;estimate_percent&#39;) from dual;\nDBMS_STATS.GET_PARAM(&#39;ESTIMATE_PERCENT&#39;)\n\n--------------------------------------------------------------------------------\nDBMS_STATS.AUTO_SAMPLE_SIZE\n\n<\/pre>\n<p>\n\tIste tablonun estimate_percent degerinden k&uuml;&ccedil;&uuml;k olan DML&rsquo;ler almasi durumunda DBA_TAB_MODIFICATIONS&nbsp;&nbsp; dict view&rsquo;indan faydalanabiliriz.<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n<\/pre>\n<p>\n\t<em>no rows selected<\/em><\/p>\n<p>\n\thimm, OPER userinin tablolarina hi&ccedil; DML gelmemis g&ouml;r&uuml;n&uuml;yor. Fakat bu bizi yaniltmasin,<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; select count(*) from OPER.DENEME;\n\n  COUNT(*)\n\n----------\n 0\n\nSQL&gt; insert into OPER.DENEME values(123, &#39;qwerty&#39;);\n\n1 row created.\n\nSQL&gt; insert into OPER.DENEME values(456, &#39;asdfg&#39;);\n\n1 row created.\n\nSQL&gt; select count(*) from OPER.DENEME;\n\n  COUNT(*)\n\n----------\n\n         2\n\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n\nno rows selected\n<\/pre>\n<p>\n\t2 row insert etmemize ragmen sanki hi&ccedil; DML yapilmamis gibi sonu&ccedil; d&ouml;n&uuml;yor.&nbsp; &Ccedil;&uuml;nk&uuml; oracle her DML isleminden sonra bu tabloyu g&uuml;ncellemiyor. &Ccedil;ok fazla DML alan tablolar varsa sadece bu islem bile &ccedil;ok kaynak t&uuml;ketecektir. &nbsp;Oracle yapilan t&uuml;m DML islemlerini memory&rsquo;de tutar. Ta ki manuel veya otomatik &ccedil;alisan bir job flush yapana kadar. Manuel flush yapmak i&ccedil;in;<\/p>\n<pre class=\"brush:sql\">\n\nSQL&gt; exec dbms_stats.flush_database_monitoring_info;\nPL\/SQL procedure successfully completed\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n\nTABLE_OWNER                    TABLE_NAME                     PARTITION_NAME                 SUBPARTITION_NAME                 INSERTS    UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS\n\n------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ---------- --------- --- -------------\nOPER                           DENEME                                                                                                2          0          0 13-MAR-13 NO              0\n<\/pre>\n<p>\n\tEwet, yaptigimiz degisiklikler g&ouml;r&uuml;lebiliyor.&nbsp; Simdi birka&ccedil; degisiklik daha yapalim;<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; update OPER.DENEME set id=789 where id=123;\n1 row updated.\nSQL&gt; instert int\nOPER.DENEME values(45678,&#39;deneme123&#39;);\nSQL&gt; insert into OPER.DENEME values(45678,&#39;deneme123&#39;);\n1 row created.\nSQL&gt; insert into OPER.DENEME values(85858, &#39;test123&#39;);\n1 row created.\nSQL&gt; delete from OPER.DENEME where id=456;\n1 row deleted.\nSQL&gt; select count(*) from OPER.DENEME;\n  COUNT(*)\n----------\n         3\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n\nTABLE_OWNER                    TABLE_NAME                     PARTITION_NAME                 SUBPARTITION_NAME                 INSERTS    UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS\n\n------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ---------- --------- --- -------------\n\nOPER                           DENEME                                                                                                2          0          0 13-MAR-13 NO              0\n<\/pre>\n<p>\n\tYaptigimiz DML islemlerin g&ouml;r&uuml;lememesinin nedeni yukarda bahsettigim gibi oracle&rsquo;in DML yapildiktan hemen sonra dba_tab_modifications tablosuna yansitmamasi. Ancak flush yaptiktan sonra yansiyacaktir;<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; exec dbms_stats.flush_database_monitoring_info;\nPL\/SQL procedure successfully completed.\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n\nTABLE_OWNER                    TABLE_NAME                     PARTITION_NAME                 SUBPARTITION_NAME                 INSERTS    UPDATES    DELETES TIMESTAMP TRU DROP_SEGMENTS\n\n------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ---------- --------- --- -------------\nOPER                           DENEME                                                                                                4          1          1 13-MAR-13 NO              0\n\n<\/pre>\n<p>\n\tSimdi de <em>DBA_TAB_MODIFICATIONS<\/em> tablosunun nasil resetlendigini g&ouml;relim.<\/p>\n<p>\n\t&nbsp;<\/p>\n<pre class=\"brush:sql\">\nSQL&gt; select table_name, last_analyzed from dba_tables \nwhere owner=&#39;OPER&#39; and table_name=&#39;DENEME&#39; order by 2 desc;\n\nTABLE_NAME                     LAST_ANALYZED\n------------------------------ -------------------\nDENEME                         03-12-2013 19:00:09\n\nSQL&gt; select table_name, last_analyzed from dba_tables where owner=&#39;OPER&#39; and table_name=&#39;DENEME&#39; order by 2 desc;\n\nTABLE_NAME                     LAST_ANALYZED\n------------------------------ -------------------\nDENEME                         03-12-2013 19:00:09\n\nSQL&gt; exec dbms_stats.gather_table_stats(&#39;OPER&#39;, &#39;DENEME&#39;);\nPL\/SQL procedure successfully completed.\nSQL&gt; select table_name, last_analyzed from dba_tables where owner=&#39;OPER&#39; and table_name=&#39;DENEME&#39; order by 2 desc;\n\nTABLE_NAME                     LAST_ANALYZED\n------------------------------ -------------------\nDENEME                         03-13-2013 17:50:48\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\nno rows selected\n\nSQL&gt; exec dbms_stats.flush_database_monitoring_info;\nPL\/SQL procedure successfully completed.\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\nno rows selected\n\nSQL&gt; select count(*) from OPER.DENEME;\n  COUNT(*)\n----------\n         3\n\nSQL&gt; delete from OPER.DENEME where id=45678;\n1 row deleted.\n\nSQL&gt; select count(*) from OPER.DENEME;\n  COUNT(*)\n----------\n         2\n\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\nno rows selected\nSQL&gt; exec dbms_stats.flush_database_monitoring_info;\n\nPL\/SQL procedure successfully completed.\n\nSQL&gt; select * from SYS.DBA_TAB_MODIFICATIONS where table_owner=&#39;OPER&#39;;\n\nTABLE_OWNER                    TABLE_NAME                     PARTITION_NAME                 SUBPARTITION_NAME                 INSERTS    UPDATES    DELETES TIMESTAMP           TRU DROP_SEGMENTS\n\n------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ---------- ------------------- --- -------------\n\nOPER                           DENEME                                                                                                0          0          1 03-13-2013 17:54:10 NO              0\n\n<\/pre>\n<p>\n\tSon testimizde g&ouml;r&uuml;lecegi &uuml;zere&nbsp; dbms_stats %10 degisiklik oldugu i&ccedil;in yeniden analiz edildi. Dolayisyla <em>DBA_TAB_MODIFICATIONS tablosu da resetlendi. &nbsp;Yeni yapilan DML islemleri ise yukarda da g&ouml;rd&uuml;g&uuml;m&uuml;z gibi ancak flush isleminden sonra DBA_TAB_MODIFICATIONS tablosunda g&ouml;r&uuml;lebildi.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tabloya en son gelen insert update zamanlari gerekebilir. Bir tablo ne zamandan beri DML almiyor g&#246;rmek istenebilir. Bunun i&#231;in neler yapilabilir.<\/p>\n","protected":false},"author":558,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[423],"tags":[4809,5472,5426,4067,3941,4713],"_links":{"self":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/367"}],"collection":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/users\/558"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/comments?post=367"}],"version-history":[{"count":0,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/posts\/367\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/media?parent=367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/categories?post=367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimmutfagi.com\/index.php\/wp-json\/wp\/v2\/tags?post=367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}