<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Baran İpek Oracle and Java</title>
	<atom:link href="http://baranipek.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://baranipek.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 18 Aug 2009 19:45:05 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language></language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='baranipek.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/6bdea0e643898c857ee9c377d65c6648?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Baran İpek Oracle and Java</title>
		<link>http://baranipek.wordpress.com</link>
	</image>
			<item>
		<title>Increase the memory of OC4J standalone server</title>
		<link>http://baranipek.wordpress.com/2009/08/18/increase-the-memory-of-oc4j-standalone-server/</link>
		<comments>http://baranipek.wordpress.com/2009/08/18/increase-the-memory-of-oc4j-standalone-server/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 19:45:05 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/?p=36</guid>
		<description><![CDATA[ If your  jsp or servlet pages  have any problems and you see  “java.lang.OutOfError” in your log files then you probably increase your JVM’s heap size. But before then  I strongly recommend you to revise your code before increasing heapsize. Maybe you don’t use connection pooling or  you create object in infinite loop J (I hope [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=36&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p> If your  jsp or servlet pages  have any problems and you see  “java.lang.OutOfError” in your log files then you probably increase your JVM’s heap size. But before then  I strongly recommend you to revise your code before increasing heapsize. Maybe you don’t use connection pooling or  you create object in infinite loop J (I hope you don’t do that).</p>
<p>If you use oc4j as a application server you will  edit opmn.xml  file .Adding parts of the xml file are highlighted below.  I increase 64 that is default to 512 M.  Once you change the file, execute the command below to request OPMN to reload the configuration file into memory:</p>
<p>&gt;$ORACLE_HOME/opmn/bin/opmnctl reload and then and then start the OC4J instance.</p>
<p> </p>
<p>&lt;process-type id=&#8221;<strong>myinstance</strong>&#8221; module-id=&#8221;<strong>OC4J</strong>&#8220;&gt;</p>
<p><strong><span style="text-decoration:underline;">-</span></strong>&lt;module-data&gt;</p>
<p><a href="/Users/Baran/Desktop/opmn.xml"><strong>-</strong></a> &lt;category id=&#8221;<strong>start-parameters</strong>&#8220;&gt;</p>
<p><strong> </strong> &lt;data id=&#8221;<strong>java-options</strong>&#8221; value=&#8221;<strong>-</strong>server -Xrs -Djava.security.policy=D:\Hukuk10gAS\j2ee\hukuk\config\java2.policy -Djava.awt.headless=true -XX:PermSize=128m -XX:MaxPermSize=128m <strong>–Xms512m –Xmx512m&#8221;</strong> /&gt;</p>
<p><strong> </strong> &lt;data id=&#8221;<strong>oc4j-options</strong>&#8221; value=&#8221;<strong>-properties</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;/category&gt;</p>
<p><a href="/Users/Baran/Desktop/opmn.xml"><strong>-</strong></a> &lt;category id=&#8221;<strong>stop-parameters</strong>&#8220;&gt;</p>
<p><strong> </strong> &lt;data id=&#8221;<strong>java-options</strong>&#8221; value<strong>=&#8221;-</strong>Djava.security.policy=D:\Hukuk10gAS\j2ee\hukuk\config\java2.policy -Djava.awt.headless=true<strong>&#8220;</strong> /&gt;</p>
<p><strong> </strong> &lt;/category&gt;</p>
<p><strong> </strong> &lt;/module-data&gt;</p>
<p><strong> </strong> &lt;start timeout=&#8221;<strong>900</strong>&#8221; retry=&#8221;<strong>2</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;stop timeout=&#8221;<strong>120</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;restart timeout=&#8221;<strong>720</strong>&#8221; retry=&#8221;<strong>2</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;port id=&#8221;<strong>ajp</strong>&#8221; range=&#8221;<strong>12501-12600</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;port id=&#8221;<strong>rmi</strong>&#8221; range=&#8221;<strong>12401-12500</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;port id=&#8221;<strong>jms</strong>&#8221; range=&#8221;<strong>12601-12700</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;process-set id=&#8221;<strong>default_island</strong>&#8221; numprocs=&#8221;<strong>1</strong>&#8221; /&gt;</p>
<p><strong> </strong> &lt;/process-type&gt;</p>
<p> </p>
<p> </p>
<p>For more reading</p>
<p><a href="http://download.oracle.com/docs/cd/B25221_04/core.1013/b15976/opmnxml.htm">http://download.oracle.com/docs/cd/B25221_04/core.1013/b15976/opmnxml.htm</a></p>
<p><a href="http://www.deakin.edu.au/its/dba/oracle-doco/9.0.4.1/9.0.4_doc_library/integrate.904/b12121/perf.htm">http://www.deakin.edu.au/its/dba/oracle-doco/9.0.4.1/9.0.4_doc_library/integrate.904/b12121/perf.htm</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=36&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2009/08/18/increase-the-memory-of-oc4j-standalone-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>Java Collections</title>
		<link>http://baranipek.wordpress.com/2008/10/05/java-collections/</link>
		<comments>http://baranipek.wordpress.com/2008/10/05/java-collections/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 18:20:01 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/?p=30</guid>
		<description><![CDATA[This is my first blog entry on java technologies. My friend asked me why I don&#8217;t publish articles on Java. So i ama little excited. Well, Today we glance at Collection on java. A collection in data structure terms, is a group of elements.It includes Sets and Lists. It also includes Maps which don’t implement [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=30&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>This is my first blog entry on java technologies. My friend asked me why I don&#8217;t publish articles on Java. So i ama little excited. Well, Today we glance at Collection on java. A collection in data structure terms, is a group of elements.It includes Sets and Lists. It also includes Maps which don’t implement Collection. Collection is the interface implemented by classes such as Arraylists,TreeSet and HashSet implement. It defines to methods to them all. Collection classes live in java.util package. I want to give ArrayList and LinkList Class example that implements List interface</p>
<p><strong>public class Data {<br />
protected int  myArray [];<br />
public int size ;<br />
public Data()<br />
{<br />
myArray = new int [50];<br />
}<br />
public Data (int n)<br />
{<br />
myArray = new int[50];<br />
size =n;<br />
}<br />
protected void finalize() {<br />
System.out.println(&#8220;cleaned&#8221; + size);</strong></p>
<p><strong>}<br />
}</strong><br />
<strong>import java.util.*;</strong></p>
<p><strong>public class ArrayListExample<br />
{</strong></p>
<p><strong>public static void main(String[] args) {<br />
ArrayList l = new ArrayList();<br />
int sizeOfL ;<br />
for (int i = 0; i&lt;5; i++)<br />
{<br />
l.add(new Data(i));<br />
}<br />
sizeOfL = l.size();<br />
for (int i = 0; i &lt;sizeOfL; i++) {<br />
int size =((Data) l.get(i)).size;<br />
System.out.println(&#8220;elements 1&#8230;&#8221; + size);<br />
}</strong></p>
<p><strong>l.add(0, new Data(6)); // 6,0,1,2,3,4<br />
l.add(2, new Data(17)); // 6,0,17,1,2,3,4<br />
sizeOfL = l.size();</strong></p>
<p><strong>for (int i = 0; i &lt;sizeOfL; i++) {<br />
int size =((Data) l.get(i)).size;<br />
System.out.println(&#8220;elements 2&#8230;.&#8221; + size);<br />
}<br />
l.remove(3); //6,0,17,2,3,4<br />
List sub = l.subList(1, 3); // 0,17<br />
}</strong></p>
<p><strong>}</strong></p>
<p>A LinkedList is similar to an ArrayList in that it is ordered by index position. If you want to have random access of the list<br />
Arraylist offers quick access than LinkList but this comes at slower operations for adding and removing in the middle of the<br />
list.<br />
Vector is synchronized whereas ArrayList is not.ArrayList and Vector class both implement the List interface. Both classes are implemented using dynamically resizable arrays, providing fast random access and fast traversal when you want programs to run in multithreading environment then use concept of vector because it is synchronized. But ArrayList is not synchronized so, avoid use of it in a multithreading environment.Arraylist has no default size but vector has size of ten. We can see using capacity()method.</p>
<p><strong>import java.util.*;<br />
public class Demo1 {<br />
public static void main(String[] args) {<br />
//creating vector<br />
Vector v= new Vector();<br />
v.add(&#8220;baran&#8221;);<br />
v.add(&#8220;ipek&#8221;);<br />
//creating enumeration interface<br />
Enumeration E=v.elements();<br />
System.out.println(&#8220;Element are : &#8220;);<br />
while(E.hasMoreElements())<br />
{<br />
System.out.println(E.nextElement()+&#8221;\t&#8221;);<br />
}<br />
//Returns the current capacity of this vector.<br />
int i=v.capacity();<br />
System.out.println(&#8220;Capacity of the vector is: &#8220;+i);<br />
}</strong></p>
<p><strong>}</strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=30&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2008/10/05/java-collections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>PL/SQL EXCEPTIONS</title>
		<link>http://baranipek.wordpress.com/2008/02/16/plsql-exceptions/</link>
		<comments>http://baranipek.wordpress.com/2008/02/16/plsql-exceptions/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 16:15:38 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/?p=29</guid>
		<description><![CDATA[Evde yaptıgım ufak bir exceptions örneğini anlatmak istedim. Birazda giriş sevyesinde fonksiyonlar ve ref cursor hakkında bilgi vermiş olacağım. Çok basit bir işlem yapan fonksiyon 3 kolondan oluşan tabloma ID verip diger bilgileri alan fonksiyon yazdım cursor döndürcem sonuç olarak. O zaman hemen fonksiyonu yazalım. Eger exception alırsam  1 parametresini yollicam.
CREATE OR REPLACE FUNCTION [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=29&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Evde yaptıgım ufak bir exceptions örneğini anlatmak istedim. Birazda giriş sevyesinde fonksiyonlar ve ref cursor hakkında bilgi vermiş olacağım. Çok basit bir işlem yapan fonksiyon 3 kolondan oluşan tabloma ID verip diger bilgileri alan fonksiyon yazdım cursor döndürcem sonuç olarak. O zaman hemen fonksiyonu yazalım. Eger exception alırsam  1 parametresini yollicam.</p>
<p><i>CREATE OR REPLACE FUNCTION test<br />
(<br />
iid    IN NUMBER,<br />
ostatu OUT NUMBER<br />
) RETURN SYS_REFCURSOR AS<br />
TYPE v_cursor IS REF CURSOR;<br />
p_cursor  v_cursor;<br />
verrormsg VARCHAR2(4000);</i></p>
<p><i>l_row VARCHAR2(200) := &#8221;;<br />
BEGIN<br />
l_row := &#8217;select * from deneme where ID = :iID&#8217;;</i></p>
<p><i>OPEN p_cursor FOR l_row<br />
USING iid;</i></p>
<p><i>EXCEPTION<br />
WHEN OTHERS THEN<br />
ostatu    := 1;<br />
verrormsg := substr(SQLERRM, 1, 3000);<br />
INSERT INTO log_data VALUES (iid, verrormsg, SYSDATE);<br />
COMMIT;<br />
RETURN p_cursor;</i></p>
<p><i>END; </i></p>
<p>Hemen ardından test ediyim bakalım data getiriyormu ?</p>
<p><i>DECLARE<br />
refcursor SYS_REFCURSOR;<br />
vid       NUMBER;<br />
vname     VARCHAR2(100);<br />
vn_statu  NUMBER;<br />
vil       NUMBER;<br />
BEGIN</i></p>
<p><i>refcursor := test(104022008230216, ostatu =&gt; vn_statu);</i></p>
<p><i>LOOP<br />
FETCH refcursor<br />
INTO vid, vname;<br />
EXIT WHEN refcursor%NOTFOUND;</i></p>
<p><i>dbms_output.put_line(vid || &#8216; | &#8216; || vname);</i></p>
<p><i>END LOOP;<br />
CLOSE refcursor;<br />
END; </i></p>
<p>Getiriyor valla denedim gördüm. Sonra ne zorum varsa gidip select çektiğim tabloyu drop ettim. Dedimki o zaman log_data tablosu yapıyım da hatayı göriyim sanki bilmiyomuşum gibi:) Exception kısmından gelebilecek tüm exceptionlar için <b>when others then </b>kullandım. Sonra yine test ettim .</p>
<p>DECLARE<br />
refcursor SYS_REFCURSOR;</p>
<p>vn_statu NUMBER;<br />
<i><br />
BEGIN</i></p>
<p><i>refcursor := test(104022008230216, ostatu =&gt; vn_statu);</i></p>
<p><i>dbms_output.put_line(vn_statu);<br />
CLOSE refcursor;<br />
END;</i></p>
<p>OUT parametrem olan 1 gördüm ve merat edip gidip log  tabloma baktım. Evet table or view doesn&#8217;t exist diyor allah allah ne oldu acaba:) Basit bir örnek göstermek istedim tabi bu arada yaptıgım eksikler de var hızlı yapıyım derken. Mesela paketin içine yazmalıydım fonksiyonu,dynamic sql &#8216;e gerek varmı ? vb.. ama dediğim gibi örneklendirmek için basit bir örnek göstermek istedim.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/29/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/29/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=29&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2008/02/16/plsql-exceptions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>PL/SQL performans</title>
		<link>http://baranipek.wordpress.com/2007/09/21/plsql-performans/</link>
		<comments>http://baranipek.wordpress.com/2007/09/21/plsql-performans/#comments</comments>
		<pubDate>Fri, 21 Sep 2007 08:20:28 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/2007/09/21/plsql-performans/</guid>
		<description><![CDATA[Using Bind or Not
SGA’nın bölümlerinden biri olan shared pool data dictionary cache ve library cache olarak iki bölümden oluşur. Library cache yazdığımız ve kullandığımız en son sql ve pl/sql leri (procedure ve function vb..) saklar yani LRU(last recent used) algoritması doğrultusunda çalıştırır. Örneğin yazdığımız bir function bir kullancı tarafından kullanılmak istendiğinde kullanıcı  bunu  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=24&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Using Bind or Not</strong></p>
<p>SGA’nın bölümlerinden biri olan shared pool data dictionary cache ve library cache olarak iki bölümden oluşur. Library cache yazdığımız ve kullandığımız en son sql ve pl/sql leri (procedure ve function vb..) saklar yani LRU(last recent used) algoritması doğrultusunda çalıştırır. Örneğin yazdığımız bir function bir kullancı tarafından kullanılmak istendiğinde kullanıcı  bunu  shared pool dan alır ve function zaten memory de olduğu için performansdan kazanmış olurum. O zaman library cache alanından haberdar olmak  bir  database developer için bize büyük fayda sağlayacaktır.</p>
<p>Library cache’in shared sql area sında yeni bir sql gelirse yeni alan oluşturulup sql için parse tree ve execution bilgileri oluşturulur. Tüm alanlar dolduğunda daha once bahsettiğimiz LRU algoritması ile alanlar sql lere dağıtılır. SQL’in  çalışması için dört evresinden (parsing,optimization,row-source generation,execution) birincisi parsing işlemidir. Parsing işleminde sql’in doğru yazılıp yazılmadığı,sql deki objelerin olup olmaması ,daha önce sql’in kullanılıp kullanılmadığı gibi daha birçok  işlem kontrol edilir ki bu da en maliyetli kısım olarak karşımıza çıkıyor. O zaman bir developer olarak performans için elimizden geldiği kadar parsing işlemini minimum sevyede tutmaya çalışacağız. O zaman amacımız  ‘one parse-execute many’  olacaktır.</p>
<p>Daha öncede bahsettiğimiz gibi developer sql ve pl/sql yazdıktan sonra Oracle shared pool’a gidip daha önceden parse ve optimized işlemi yapılmış diye bakar. Eğer bulursa tekrar kullanır ve bu sistem için en performanslı yoldur . Eğer  bulamazsa yukarda bahsettiğimiz dört aşamadan geçer. İşte bu noktada bind variable yardımımıza koşacaktır. Tek kullanıcılı sistemde performans farkı kullanıp kullanmama arasında daha az olacktır ama analizler yine bind kullanımı destekleyecektir.</p>
<p><em>Select * from emp where empno=123;</em></p>
<p><em>Selct * from emp where empno=:empno;</em></p>
<p>Mesela yukardaki ilk sorguda 123 nolu employee getirdim. Sonra bunu 234,345 vb gibi değiştirdiğim zaman her seferinde sorgumu baştan parse etmiş olacağım. Bind variable kullandığım ikinci sorguda ise sorgu bir kez compile edilip query planıyla birlikte library cache saklanır. Daha sonra istenildiği zaman parse edilmeden kullanılabilinir. Şimdi daha önceden bahsettiğimiz tkprof ile örneklerimizi analiz edelim. Birincisinde bind variable kullanıp ikincisinde kullanmayacağım. Alter system flush shared_pool ile testimin sağlıklı sonuç vermesi için shared pool’u sıfırlayacağım.</p>
<p>set timing on<br />
set serveroutput on</p>
<p>alter session set max_dump_file_size=unlimited;<br />
ALTER session SET timed_statistics = true;<br />
alter session set STATISTICS_LEVEL = ALL ;</p>
<p>alter system flush shared_pool;<br />
alter system flush buffer_cache;</p>
<p>alter session set tracefile_identifier = bind ;<br />
ALTER SESSION SET EVENTS &#8216;10046 TRACE NAME CONTEXT FOREVER, LEVEL 12&#8242;;</p>
<p>declare<br />
TYPE rc IS REF CURSOR;<br />
l_rc    rc;<br />
l_dummy all_objects.object_name%TYPE;<br />
l_start NUMBER DEFAULT dbms_utility.get_time;<br />
BEGIN<br />
FOR i IN 1 .. 1000 LOOP<br />
OPEN l_rc FOR &#8217;select object_name<br />
from all_objects<br />
where object_id = <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> &#8216; USING i;<br />
FETCH l_rc INTO l_dummy;<br />
CLOSE l_rc;<br />
END LOOP;<br />
dbms_output.put_line(round((dbms_utility.get_time &#8211; l_start) / 100,<br />
2) || &#8217;seconds&#8230;&#8217;);<br />
END;<br />
/</p>
<p>ALTER SESSION SET EVENTS &#8216;10046 TRACE NAME CONTEXT OFF&#8217;;</p>
<p>1.48seconds&#8230;</p>
<p>set timing on<br />
set serveroutput on</p>
<p>alter session set max_dump_file_size=unlimited;<br />
ALTER session SET timed_statistics = true;<br />
alter session set STATISTICS_LEVEL = ALL ;</p>
<p>alter system flush shared_pool;<br />
alter system flush buffer_cache;</p>
<p>alter session set tracefile_identifier = nobind1 ;<br />
ALTER SESSION SET EVENTS &#8216;10046 TRACE NAME CONTEXT FOREVER, LEVEL 12&#8242;;</p>
<p>declare<br />
TYPE rc IS REF CURSOR;<br />
l_rc    rc;<br />
l_dummy all_objects.object_name%TYPE;<br />
l_start NUMBER DEFAULT dbms_utility.get_time;<br />
BEGIN<br />
FOR i IN 1 .. 1000 LOOP<br />
OPEN l_rc FOR &#8217;select object_name<br />
from all_objects<br />
where object_id = &#8216; || i;<br />
FETCH l_rc INTO l_dummy;<br />
CLOSE l_rc;<br />
END LOOP;<br />
dbms_output.put_line(round((dbms_utility.get_time &#8211; l_start) / 100,<br />
2) || &#8217;seconds&#8230;&#8217;);<br />
END;<br />
/</p>
<p>ALTER SESSION SET EVENTS &#8216;10046 TRACE NAME CONTEXT OFF&#8217;;</p>
<p>31.02seconds&#8230;</p>
<p>İki sorgu arasında zaman farkı anlamak için başta ve sonda dbms_utility.get_time ile zamanı alıp kıyasladığımda bind kullanmadan yaklaşık 30 katı kadar sure fazla harcamış gözüküyorum. İlk trace dosyamın boyutu 57kb ikne ikinci trace dosyam 3mb civarında. O zaman trace dosyalarımızın farkının nerden geldiğine bir bakalım.</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
Parse     1063      0.02       0.02          0          0                 0           0<br />
Execute  1092     0.17       0.23          0          0                 0           0<br />
Fetch     1301     0.08       0.93        171       6790             0        1203<br />
total     3456      0.27       1.19        171       6790             0        1203</p>
<p>Misses in library cache during parse: 7</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
Parse     2100     29.07      29.73          0          6                    0             0<br />
Execute  2296      0.34       0.31          0          0                     0            0<br />
Fetch     2612      0.32       2.10        200      10549                 0         3646<br />
total     7008     29.73      32.15        200      10555                0          3646</p>
<p>Misses in library cache during parse: 1019</p>
<p>Yukardaki analizleri kıyasladığımda  ikinci trace’imde parse işlemin maliyeti görüldüğü gibi cpu değerine de yansıdı. Fazladan parsing,cpu kullanımı,response time performansımın düşmesine neden oldu.</p>
<p>Bind</p>
<p>select object_name<br />
from all_objects<br />
where object_id = <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> </p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
Parse     1000      0.02       0.01          0          0          0           0<br />
Execute 1000      0.15       0.19          0          0          0           0<br />
Fetch     1000      0.05       0.19        49       6315          0         953<br />
total     3000      0.22       0.40         49       6315          0         953</p>
<p>Nobind</p>
<p>select object_name<br />
from all_objects</p>
<p>where object_id = 1</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
Parse        1      0.07       0.07              0          0                    0           0<br />
Execute      1      0.00       0.00            0          0                    0           0<br />
Fetch        1      0.00       0.02             2          5                     0           1<br />
total        3      0.07       0.09               2          5                     0           1</p>
<p>………………………………………..<br />
………………………………………..<br />
……………………………………….</p>
<p>select object_name<br />
from all_objects</p>
<p>where object_id = 999</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
Parse        1      0.07       0.07               0             0          0           0<br />
Execute    1      0.00       0.00               0             0          0           0<br />
Fetch        1      0.00       0.02               3             8          0           1<br />
total          3      0.07       0.09               3             8          0           1</p>
<p>Birinci trace dosyamda yukardaki sorgu için bir defa plan oluşturuluken ikinci sorgumda x değerinin 1000’e kadar her değeri için ayrı  parse etti ve plan oluşturdu ve bu ikinci trace dosyamın büyük boyutlara ulaşmasına neden oldu. Bind variable’nın parse sayısını azaltması  cpu  kazanımın yanında çoklu kullanıcılarda library cachedeki  latch sayısını da azaltacağı için sistem daha hızlı çalışacaktır. Share sql alanında bir anda tek oturum hard parse edeceğinden birçok kullanıcının hard parse yapması bekleme yaratacaktır. Bu da yine performans kaybına yol açar.</p>
<p>Bind variable performansın yanında veritabanı güvenliği açısından da önemlidir. Sql injection sql üzerinden veritabanına sızma olarak adlandırılır. Bu bir paket çağırma,verileri göstermek olabilir. Sql injection olması için sql’in dynamic sql olması gerekir ve gelecek parametrelere  gore runtime sırasında oluşur ve bu da güvenlik açısından bir açık olarak karşımıza çıkabilir. İşte bu noktada bind variable kullanımı yardımımıza yetişiyor.</p>
<p>IF you use dynamic sql<br />
AND<br />
you use string concatenation<br />
THEN<br />
you are subject to sql injection<br />
END IF</p>
<p>Yukarda ifade ettiğimiz gibi concatenation kullanımı sql injection için uygun zemin hazırlayacaktır. Şimdi sql injection yönetmi ile ilgili bir örnek yapıp bind kullanımın yararlarını görelim. Önce bir tablo yaratacağız sonra sonra bir fonksiyon yardımıyla banka hesabına sızmaya çalışağız.</p>
<p>create table my_top_secrets (<br />
PK_SECRET VARCHAR2(30) PRIMARY KEY,<br />
BANK_ACCOUNT VARCHAR2(30),<br />
AMOUNT NUMBER(10)<br />
);<br />
insert into my_top_secrets values(’1′, ‘Malta Bank &#8211; 123456′, 123000000);<br />
insert into my_top_secrets values(’2′, ‘Isviçre Bank &#8211; 7890′, 4567000000);<br />
commit;</p>
<p>create or replace function get_bankaccount(p_secret varchar2) return varchar2 is<br />
TYPE rc IS REF CURSOR;<br />
l_rc rc;<br />
l_dummy varchar2(64) := &#8216;Fail&#8217;;<br />
BEGIN<br />
OPEN l_rc FOR &#8217;select BANK_ACCOUNT<br />
from my_top_secrets<br />
where PK_SECRET = &#8216;|| p_secret;<br />
FETCH l_rc INTO l_dummy;<br />
CLOSE l_rc;<br />
return l_dummy ;<br />
END;</p>
<p>Tabloyu yaratıp satırları ekledik sonra bize  banka hesaplarını getirmesini istedik .</p>
<p>set serveroutput on<br />
declare<br />
l_dummy1 varchar2(64) := &#8216;-1&#8242;;<br />
l_dummy2 varchar2(64);<br />
begin<br />
l_dummy2 := get_bankaccount(l_dummy1);<br />
dbms_output.put_line(l_dummy2);<br />
end;<br />
/<br />
Fail<br />
PL/SQL procedure successfully completed.</p>
<p>Dedikten sonra  beklendiği üzere fail mesajını  aldık</p>
<p>declare<br />
l_dummy1 varchar2(64) := ‘-1′ || ‘ or 1=1′;<br />
l_dummy2 varchar2(64);<br />
begin<br />
l_dummy2 := get_bankaccount(l_dummy1);<br />
dbms_output.put_line(l_dummy2);<br />
end;<br />
/</p>
<p>Malta Bank &#8211; 123456</p>
<p>Yukarıda  kırmızıyla eklenen kısımla banka hesabımızın içine sızılmış oldu. Halbuki fonksiyonu yazarken bu durumu düşünmemiştik. O zaman  bu gibi durumlara karşı önlem almak için fonksiyonda bind kullanıp tekrar sızmaya çalışalım.</p>
<p>create or replace function get_bankaccount (p_secret varchar2) return varchar2 is<br />
TYPE rc IS REF CURSOR;<br />
l_rc rc;<br />
l_dummy varchar2(64) := &#8216;Fail&#8217;;<br />
BEGIN<br />
OPEN l_rc FOR &#8217;select BANK_ACCOUNT<br />
from my_top_secrets<br />
where PK_SECRET = <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> &#8216; USING p_secret;<br />
FETCH l_rc INTO l_dummy;<br />
CLOSE l_rc;<br />
return l_dummy ;<br />
END;<br />
/<br />
declare<br />
l_dummy1 varchar2(64) := &#8216;-1&#8242;|| &#8216;or 1=1&#8242;;<br />
l_dummy2 varchar2(64);<br />
begin<br />
l_dummy2 := get_bankaccount(l_dummy1);<br />
dbms_output.put_line(l_dummy2);<br />
end;<br />
/</p>
<p>Fail</p>
<p>Bind kullanımından sonra bilgilerimize ulaşılamadı. Zaten bind kullanımın performasını yukarıda ıspatlamıştık. O zaman dynamic sql ifadelerde veya  java da bind kullanamadığımız durumlar hariç(tablo isimleri,colon isimleri vb) her zaman bind kullanımı performans ve güvenliğimiz açısından yararlı olacaktır.</p>
<p><strong>Cursor</strong></p>
<p>PL/SQL içinde SQL yazdığımız zaman Oracle sqller için özel bir alan tahsis eder. Bu alan yazdığımız sqllerden ve getirdiği kayıtlardan oluşur. Cursor bu alana isim verebilmemizi ve içerdiği kayıtarı işlememizi sağlayan pl/sql mekanizmasıdır ya da başka bir deyişle veritabanımdaki tabloların içindeki pointer olarak söylenebilinir. İki çeşit cursor tanımlayabiliriz.</p>
<p>Kapalı İmleçler(İmplicit Cursor): Yazılan her sql komutları için Oracle tarafından  otomatik olarak açılan imleçlerdir. Yazılan her kapalı imleç için SQL%NOTFOUND, SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND özellikleri açıktır.Cursor declare etmeye gerek yoktur .</p>
<p>SELECT SUM (salary) INTO department_total<br />
FROM employee<br />
WHERE department_number = 10;</p>
<p>Yukardaki ifader için Oracle implicit cursor otomatik olarak yaratacaktır. Eğer ifade birden fazla satır getitirse exception yaratacaktır. İkinci satırı getirmem için TOO_MANY_ROWS exception’ a ihtiyacım olacaktır .</p>
<p>Açık İmleçler(Explicit Cursor):Programcı  tarafından belirli bir işi yapabilmek için açılan imleçlerdir..Cursordaki birden çok  satıra tek tek erişme, processde olan satırı işlemek gibi işlemleri programcıya sunan cursor çeşididir. Parametre alabilir.</p>
<p>declare<br />
cursor c1 is select ename, job, sal from emp;<br />
v_ename emp.ename%type;<br />
v_job emp.job%type;<br />
v_sal emp.sal%type;<br />
begin<br />
open c1;<br />
loop<br />
fetch c1 into v_ename, v_job, v_sal;<br />
exit when c1%notfound;<br />
dbms_output.put_line(v_ename||&#8217;  &#8216;|v_job||&#8217;  &#8216;||v_sal);<br />
end loop;<br />
end;<br />
/</p>
<p>Yukarda gördüğümüz önce cursorı declare ettik sonra open ile açtık ve bir döngü içerisinde daha once kolonla aynı type da kolon değişkenlere fetch ettik. Yukarıda gördüğümüz gibi cursorun açılması,fetch edilmesi ve kapanması herşeyi programcı yapıyor fakat implicit cursorda Oracle bu işlemleri otomatik yapar. Şimdi implicit ve explicit cursorları kıyaslayalım ve hangisi kullanacağımıza karar verelim. İlk önce performansları kıyaslayalım.</p>
<p><strong>İmplicit cursor</strong></p>
<p>create or replace procedure implicit_interpreted( p_times in number )<br />
as<br />
l_dummy dual.dummy%type;<br />
l_start number default dbms_utility.get_time;<br />
begin<br />
for i in 1 .. p_times<br />
loop<br />
select * into l_dummy from dual;<br />
end loop;<br />
dbms_output.put_line( (dbms_utility.get_time-l_start) || &#8216; hsecs&#8230;&#8217; );<br />
end;<br />
/<br />
<strong><br />
Explicit cursor</strong></p>
<p>create or replace procedure explicit_interpreted( p_times in number )<br />
as<br />
cursor c is select * from dual;<br />
l_dummy dual.dummy%type;<br />
l_start number default dbms_utility.get_time;<br />
begin<br />
for i in 1 .. p_times<br />
loop<br />
open c;<br />
fetch c into l_dummy;<br />
if ( c%notfound ) then<br />
raise no_data_found;<br />
end if;</p>
<p>fetch c into l_dummy;<br />
if ( c%found ) then<br />
raise too_many_rows;<br />
end if;</p>
<p>close c;<br />
end loop;<br />
dbms_output.put_line( (dbms_utility.get_time-l_start) || &#8216; hsecs&#8230;&#8217; );<br />
end;<br />
/</p>
<p>exec explicit_interpreted( 50000 );</p>
<p>PL/SQL procedure successfully completed.</p>
<p>Elapsed: 00:00:26.51</p>
<p>call     count          cpu    elapsed       disk      query    current        rows<br />
Parse       31            0.00       0.00          0             0                 0                 0<br />
Execute  50035        1.14       1.13          0           0               0                     0<br />
Fetch   100113         1.41       1.89         78     150264          0           50093<br />
total     150179         2.55       3.02         78     150264          0           50093</p>
<p>exec implicit_interpreted( 50000 );</p>
<p>PL/SQL procedure successfully completed.</p>
<p>Elapsed: 00:00:02.48</p>
<p>call     count       cpu    elapsed       disk      query    current        rows<br />
&#8212;&#8212;- &#8212;&#8212;  &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-  &#8212;&#8212;&#8212;-<br />
Parse       31      0.00       0.00          0          0          0           0<br />
Execute  50035      1.00       1.05          0          0          0           0<br />
Fetch    50113      1.43       2.27         76     150267          0       50093<br />
&#8212;&#8212;- &#8212;&#8212;  &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-  &#8212;&#8212;&#8212;-<br />
total   100179      2.43       3.33         76     150267          0       50093</p>
<p>Parse ve execute aynı değerlere sahip çıktı. Elapsed süreleri  için explicit cursor’ın daha fazla çıktı. Cpu kullanımı explicit de daha fazla olduğunu gördük. İmplicit cursor daha performanslı olduğunu burda ıspatladı  Ayrıca select into yazmanın open,fetch,close yazmaya gore   kadar kolay olduğu örneğimizden de görebiliriz. Sadece sql ile yapabileceğimiz sorguları sql ile yapmalı ve  bunu pl/sql bırakmalıyız. Bu bize performans kaybı olarak dönecektir.  Daha öncede bahsetdiğimiz gibi kolay yazılıp okunan kompleks olmayan kodlar herzaman bizim için daha avantajlı olacaktır.</p>
<p>İmplicit</p>
<p>for x in ( select * from t )<br />
loop<br />
&#8230;.<br />
end loop</p>
<p>Explicit<br />
Cursor is select * from t;<br />
open c;<br />
loop<br />
fetch c into x;<br />
exit when c%notfound<br />
&#8230;.<br />
end loop;<br />
close c;</p>
<p>Yukardaki aynı işlevi yapan iki farklı cursora baktığım zaman daha öncede bahsettiğimiz yazım kolaylığı ortaya çıkıyor. Explicit cursorda bazen nerde cursor’ın açılacağını  nerde kapanacağını ya da nıasl yazılacağını unutabilirsiniz. Kısacası kompleks sorgulardan uzak durmaktan yana olacağız. İmplicit ile ilgili ilk örneğimizde birden fazla satır getirmemiz gerektiğinde  TOO_MANY_ROWS exceptionu kullanmamız gerekir demiştik. Aşağıdaki örnekleri inceleyip bu durumu tekrar gözden geçirelim.</p>
<p>Explicit cursor</p>
<p>declare<br />
l_dname  dept.dname%type;<br />
l_deptno dept.deptno%type;<br />
l_ename  emp.ename%type;</p>
<p>cursor c1<br />
is<br />
select deptno, dname<br />
from dept<br />
order by deptno;</p>
<p>cursor c2( p_deptno in number )<br />
is<br />
select ename<br />
from emp<br />
where deptno = p_deptno<br />
and sal = (select max(sal)<br />
from emp<br />
where deptno = p_deptno);<br />
begin<br />
open c1;<br />
loop<br />
fetch c1 into l_deptno, l_dname;<br />
exit when c1%notfound;<br />
open c2(l_deptno);<br />
fetch c2 into l_ename;<br />
close c2;<br />
dbms_output.put_line<br />
( l_deptno || &#8216;, &#8216; || l_dname || &#8216;, &#8216; || l_ename );<br />
end loop;<br />
close c1;<br />
end;<br />
/</p>
<p>İmplicit cursor</p>
<p>declare<br />
l_ename  emp.ename%type;<br />
begin<br />
for x in (select deptno, dname from dept order by deptno)<br />
loop<br />
begin<br />
select ename into l_ename<br />
from emp<br />
where deptno = x.deptno<br />
and sal = (select max(sal)<br />
from emp<br />
where deptno = x.deptno)<br />
and rownum = 1;<br />
exception when no_data_found<br />
then<br />
l_ename := &#8216;(none)&#8217;;<br />
end;<br />
dbms_output.put_line<br />
( x.deptno || &#8216;, &#8216; || x.dname || &#8216;, &#8216; || l_ename );<br />
end loop;<br />
end;<br />
/</p>
<p>Yukarda yazdığımız implicit cursor bu sefer birden fazla satır getirme ihtimaline karşı hata vermesine karşın rownum=1 ile tek tek getirmesini ve no_data_found ile boş satır getirmesi durumunda ne yapması gerktiğini söyledik ve böylece implicit cursor ile ilgili birden fazla satır getirirken TOO_MANY_ROWS exception kullanmamız gerektiği ve explicit cursor’ın bize daha fazla kontrol etme imkanı sunduğu gibi  ifadeleri yıkmış olduk. İmplicit cursor’ın performansını ve kullanım kolaylığını ıspatladıktan sonra artık geriye  bize implicit cursor kullanmak düşüyor.</p>
<p><strong>Using the BULK COLLECT Clause</strong></p>
<p>Yukarıda gördüğümz gibi sql ifadelerimiz çalışırken pl/sql engine ve sql engine sürekli birbirleriyle satır  transferi  halindedirler. Bulk Binding iki engine arasında satırları  transfer ederken collections(dizi veya liste) halinde gönderme olanağı sağlar. Bu da performansı artıracaktır.</p>
<p>Bulk Collect bulk binding ‘in select sorguları  için kullandığı sentaksıdır.Bulk Collect bütün satırları tek seferde  resul set olarak almamızı sağlar. Satırda istediğimiz kolonu değişkene atarak istediğimiz işlemi yapmamızı sağlar ve bunu çok hızlı bir şekilde yapar. SELECT INTO, FETCH INTO, and RETURNING INTO clauseları yardımıyla kullanabiliriz.Şimdi bir tablo yaratıp all_objects kayıtlarını alalım ve birkaç kez  defa insert  edelim.</p>
<p>create table t_all_objects as select * from all_objects;</p>
<p>insert into t_all_objects select * from t_all_objects;</p>
<p>insert into t_all_objects select * from t_all_objects;</p>
<p>Bulk</p>
<p>SQL&gt; declare<br />
2  cursor c1 is select object_name from t_all_objects;<br />
3  type c1_type is table of c1%rowtype;<br />
4  rec1 c1_type;<br />
5  begin<br />
6  open c1;<br />
7<br />
8     fetch c1 bulk collect into rec1;<br />
9<br />
10<br />
11  end;<br />
12  /</p>
<p>call     count       cpu    elapsed       disk      query       current        rows<br />
Parse       28      0.01        0.02          2             2              0               0<br />
Execute  30      0.02         0.02          0             0               0               0<br />
Fetch      84       0.97        2.47       1433         1609          0           110660<br />
total       142      1.00        2.52       1435         1611          0           110660</p>
<p>Nobulk</p>
<p>declare<br />
cursor c1 is select object_name from t_all_objects;<br />
rec1 c1%rowtype;<br />
begin<br />
open c1;<br />
loop<br />
fetch c1 into rec1;<br />
exit when c1%notfound;<br />
null;<br />
end loop;<br />
end;</p>
<p>call     count       cpu    elapsed       disk         query      current           rows<br />
Parse       14        0.01       0.01          1              1                0                 0<br />
Execute    15       0.02       0.01          0            0                0                0<br />
Fetch     98346     1.50       2.16       1259       98405          0             98338<br />
total       98375     1.53       2.19       1260         98406          0             98338</p>
<p>Yukarıda görüldüğü gibi ilk örneğimde fetch ederken bulk collect kullandım. Sql ve pl/sql engine  arasındaki row  satır interaction azaldı, fetch sayım azaldı ve daha az cpu kullanımı sağlamış oldum.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/24/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/24/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=24&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2007/09/21/plsql-performans/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>Düşünelim Bakalım</title>
		<link>http://baranipek.wordpress.com/2007/09/21/dusunelim-bakalim/</link>
		<comments>http://baranipek.wordpress.com/2007/09/21/dusunelim-bakalim/#comments</comments>
		<pubDate>Fri, 21 Sep 2007 08:18:40 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Zeka Soruları]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/2007/09/21/dusunelim-bakalim/</guid>
		<description><![CDATA[Aslında zekanın bir iki soruyla ölçülmeyeceğini düşünsemde(çok yönlü bir kavram) yinede bazı begendiğim sorular oluyor onları paylaşmak istedim.Emrehan Halıcının zeka soruları kitabından yazıcam yavşa yavaş bir-iki soruyla başlayalım sonra yazarım cevapları:)
1-)İki arkadaş bir oyun oynuyor. 10 tane şişeden sırayla 1 ya da 2 şişe alma şansınız var. Sıranızda sizde  iken diğerine şişeleri alıp diğerine [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=25&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Aslında zekanın bir iki soruyla ölçülmeyeceğini düşünsemde(çok yönlü bir kavram) yinede bazı begendiğim sorular oluyor onları paylaşmak istedim.Emrehan Halıcının zeka soruları kitabından yazıcam yavşa yavaş bir-iki soruyla başlayalım sonra yazarım cevapları:)</p>
<p>1-)İki arkadaş bir oyun oynuyor. 10 tane şişeden sırayla 1 ya da 2 şişe alma şansınız var. Sıranızda sizde  iken diğerine şişeleri alıp diğerine şişe bırakmayan oyunu kazanıyor. Oyuna sizin başladığınızı düşünürseniz oyunu kazanmak için nasıl bir yol izlersiniz.</p>
<p>2-)İki arkadaş atlarını yarştırmak istiyorlar ama farklı olarak yarışmayı sonuncu kazanacaktır.İkiside başlangıç çizigisine geliyor ama yarışmayı sonuncu kazanacağı için başlamak istemiyorlar. Bu yarışmayı nasıl gerçekleştiririz o zaman?</p>
<p>3-)100 tane kartım var ve üstlerinde yazılar var. İlk kartı açtım ve üstünde &#8220;bu kartların yalnızca bir tanesi yalan söylüyor &#8221; yazıyor ikinciyi açıyorum &#8220;bu kartların yalnızca iki tanesi yalan söylüyor&#8221; yazıyor ve  yazılar açtığım kartın sırası olarak  artarak gidiyor .Peki kaçıncı kart doğru söylüyor.</p>
<p>Devamı gelecek:)</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=25&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2007/09/21/dusunelim-bakalim/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>Parallel Execution</title>
		<link>http://baranipek.wordpress.com/2007/09/21/parallel-execution/</link>
		<comments>http://baranipek.wordpress.com/2007/09/21/parallel-execution/#comments</comments>
		<pubDate>Fri, 21 Sep 2007 05:43:14 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/2007/09/21/parallel-execution/</guid>
		<description><![CDATA[Parallel Execution
Parallel Execution Oracle 7.1 ile gelmiş Standart Edition da olamayıp Enterprise Edition’a ait bir özelliktir.   Parallel  Execution’u aklınız da canlandırmak için bir ev yaptırdğınızı düşünün evin yapımında birden çok takım çalışacaktır.  Evin yapımında herkesin aynı anda aynı iii yapması yerine  binanın dikilmesi ve elektirik tesisatı gibi farklı görevlerin aynı [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=22&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Parallel Execution</strong></p>
<p>Parallel Execution Oracle 7.1 ile gelmiş Standart Edition da olamayıp Enterprise Edition’a ait bir özelliktir.   Parallel  Execution’u aklınız da canlandırmak için bir ev yaptırdğınızı düşünün evin yapımında birden çok takım çalışacaktır.  Evin yapımında herkesin aynı anda aynı iii yapması yerine  binanın dikilmesi ve elektirik tesisatı gibi farklı görevlerin aynı anda yapıldığını düşünün şüphesiz evinize erken oturacaksındır.</p>
<p>Oracle da Paralel Execution da aslında aynı mantığı uygular büyük jobları küçük parçalara bölerek concurrent olarak gerçekleştirir. Mesela bir tablo full scan yapılıcaksa 4 processin tablonun farklı yerlerini okuması ve sonucu  process koordinatöre getirerek client a sonuc döndürülür ve bu   response time ‘ı düşürecektir. En kaba tabirle Oracle ‘ın bir processle yapacağı bir işi birden çok küçük iş parçacıklarına bölüp bunların aynı anda çalışmasıdır.</p>
<p>Seri işlemlerde mesela  tablolarmuz full scan edilsin dedicated server process sonucu user processe döndürürür. Paralel query de ise mesela server ikinci derecen paralel hinti görünce Query coordinator tarafından iki dedicated server process yaratılır ve scanlenecek bloklar ikiye ayrılıp slave processler gönderilir.</p>
<p>Parallel  Execution uygulamadan önce iki şeyden emin olmalısınız.</p>
<p>1-) Büyük bir taskınız olmalı (Mesela 50 gb full scan data)<br />
2-) Yeterli kaynağınız oldugundan emin olmalısınız yeterli cpu  ve I/O gibi (Paralel Processlerin çalışması için).50 gb verininde bieden çok diske dagılması ve disklerden datayı getirmek için  I/O kanallarının yeterli olması beklenir.</p>
<p><strong>A Paralel Analogy</strong></p>
<p>Şimdi neden fazla veri ve yeterli kaynak istediğimizi  örneklerle açıklayalım. İki task olduğunu düşünün birincisi bir sayfanın özetini alacak ikincisi ise 10 chapter’ın kısa bir  özetini alacak ve her bir chapter birbirinden bağımsız halde farklı konular içeriyor.</p>
<p>Birinci görev de sayfada 12 paragraf var ve paragraflar birbirinden bağımsız değiller. Siz bir paralel process kordinatör oldugunuzu düşünün ve 12 kişilik bir takım tuttunuz ve her bir paragrafı bir kişiye verip problemi anlattınız. Sonra her paragraf özetini alıp dogru yazılıp yazılmadığını kontrol edip sıraya koyup yazdırdınız. Bütün bu işlemler sizin serial olarak sayfanın özetini yazmanızdan daha çok zaman alacaktır. İkinci göreve gelince her üniteyi bir kişi verip onlardan gelen sonuçları direk yazdırmanız çok daha performanslı olacaktır.Kaynak yeterliliği konusundan ise bir yine manager olun ve bir işi takımdaki bireylere dağıtmak istediğinizi düşünün eger takım arkadaşlarınıza yapabileceklerinden fazla iş veremezsiniz ve kaynağınız yani çalışanlarınız üstlendikleri işleri yerine getiremiyeceklerdir.</p>
<p>Parallel Execution büyük tablo scanlerken,joinlerken, büyük indeksler yaratırken,tablolar,materialized view yaratırken,bulk insert,merge,update ve delete lerde  performansı artırması beklenir.Ayrıca LOB gibi database objelerine de paralel ulaşabilirsiniz.Multiprocessor, yeterli I/O bandwith,yeterli olarak kullanılmayan CPU (mesela %30 un altı) paralel execution performansı için olumlu koşullar olacaktır. Data Warehouse ,OLTP batch processler için paralel execution uygun koşullarda performansı artıracaktır. 1-2 saniye süren kısa tipik OLTP işlemlerde paralel execution yararlı olmayacaktır çünkü slave processlerin koordine edilmesi de bir cost yarattığından bu tip uygulamalarda paralel execution kullanmak performansı düşürecektir. Ayrıca I/O ve CPU yeterince kullanılan sistemlerde kullanmak da yine performansı düşürecektir.</p>
<p><strong>Paralel Query</strong></p>
<p>Paralel query de bir sql ‘in birden çok işparçacıklarına bölünüp bunların eşzamanlı çalışmasıdır. Paralel query de tablo birbiriyle kesişmeyen parçalara bölünür ve her bir slave process tablonun ilgili kısmını okuyup sayar ve  asıl kullanıcıya sonucu döndürecek olan server process olan kordinatöre sonuç döner.</p>
<p>Select count(status)  from  big tables;</p>
<p>Id  |  Operation  |  Name        |  Rows   |Bytes   | Costs (%CPU)  | Time<br />
1    SELECT STATEMENT                                    2                    00:06:29<br />
2      SORT AGGREGATE<br />
3        TABLE ACCES FULL                                  2                    00:06:29</p>
<p>Yukarıda beklediğimiz gibi seri planla karşılaştık Parallelism uygulamak için sql ‘e hint koyabilir ya da objeye paralleliğin derecesi dikte edebiliriz.</p>
<p>&gt;&gt; alter table big_table parallel 4 ;<br />
Ya da</p>
<p>&gt;&gt; alter table big_table paralel ;<br />
Şeklinde yazıp parallelism derecesini Oracle ‘a bırakıyor ve Oracle  kaynaklarını uygunsa dinamik olarak parallelik derecesini artıracaktır ya da kaynaklar yogunsa paralellik derecesini düşürecektir.</p>
<p>&gt;&gt;explain plan for<br />
2 select count (status) from big_table ;</p>
<p>Id  |  Operation  |  Name        |  Rows   |Bytes   | Costs (%CPU)  | Time<br />
0	SELECT STATEMENT                             1                    00:00:54<br />
1	 SORT AGGREGATE<br />
2	   PX COORDINATOR<br />
3	     PX SEND QC (RANDOM)<br />
4	       SORT AGGREGATE<br />
5	         PX BLOCK ITERATOR<br />
6	            TABLE ACCES FULL                  1<br />
7</p>
<p>Genel anlamda paralel execution  çalıştırırken datayı oldukça fazla diskte tutmak ,raid  diskler arasında strinping için ve partitioning datayı fiziksel olarak datalara dagıtmak için kullanılmalıdır ve tablespace de birden çok datafile oluşturmak Oracle ‘ın tablo segmentleri  extent etmesi için   performanslı olacaktır. Bütün bunlar datayı tek diskte tutulursa paralel execution kullanmak işe yaramayacaktır anlamına gelmiyor fakat ideal olan  tablo yukarda bahsettiklerimden oluşuyor.<br />
<strong><br />
Parallel DML(PMDL)</strong></p>
<p>Insert,update,delete,merge gibi dml cümlecikleri paralelleştirilebilinir.PMDL de yine parallel execution servers lar tek process yerine DML işlemlerini gercekleştirir.PDML ler yine direk OLTP işlemlerin performansını artırmak için düşünülen  bir yol değildir. Genel de tek kullanıcın kaynakları(CPU,disk,memory) en fazla kullanılmasına yönelik bir özelliktir. Paralel execution datawarehouse(çok data,az kullanıcı) işlemlerde  uzun süren table summary alırken  performans sağlar ve OLTP de  long batch job işlemler de yine performansı artırır. OLTP işlemlerde haliyle kısa transaction ve çok kullanıcılı ortamlarda makine kaynaklarını tamamen kullanıcın kullanmasını haliyle istemeyeceksinizdir.DML işlemleri paralelleştirilirken oracle belli kurallar uygular. UPDATE ve DELETE işlemleri için ayrı İNSERT işlemleri için ayrı kuralları vardır.</p>
<p>•	Trigerlar PDML operasyonları süresince desteklenmez çünkü ilk update ler sırasında tigerlar sisteme yük olabilir ve sizde PDML hızlı olması için kullandıgınız için iki özellik aynı anda çalışmaz.</p>
<p>•	PDML ile değişikliğe uğrayan tabloya commit ya da rollback denilmeden ulaşamazsınız.</p>
<p>•	Clustured table desteklenmez.</p>
<p>•	Bitmap indeks ve lob kolonlarında eger tablo partitioned ise çalışır ve slave process sayısı partition sayısı ile aynı olmalıdır.</p>
<p>•	Insert values desteklenmez .</p>
<p>Oracle 	UPDATE ve DELETE statementları sadece partitioned tablolarda gecerlidir. Nonpartitioned table da DML ifadeleri paralelleştirlemez. Standart INSERT ifadeleri paralelleştirlemez .INSERT SELECT FROM  statemenları paralelleştirilebilinir.Örnek vermek gerekirse:</p>
<p>alter session enable parallel dml;<br />
insert /*+ parallel (emp_big,4,1) */<br />
into emp_big select * from emp;<br />
commit;<br />
alter session disable parallel dml;</p>
<p><strong>How Parallel Execution Works</strong></p>
<p>Oracle  taskları alıştıran SQL statementları  küçük birimlere ayırarak bagımsız process (threads wndows enirement )olarak çalıştırır. Query coordinator parallelleştirmek için işi küçük parçacıklara böler.Bu processler  parallel execution server processes, parallel slave processes gibi adlandırılabilinir. Her bir processe bir gorev atar. Sonra her slave processeden dönen sonucu toplayıp statement’ın sahip oldugu user process’e döner. İş bitiminden sonra her slave process bırakılır ve server pool’a döner.</p>
<p><strong>How Parallel Execution Servers Communicate<br />
</strong><br />
Sorgunuzun parallel çalışması için Oracle producer queue server ve  consumer server yaratır.Producer queue server tablodan datayı getirir ve consumer server join,dml ve ddl işlemlerini yapar. Her producer bir consumer’a connection ile bağlıdır. Bu da virtual bağlantı sayısı paralleliğin derecesini vermekte olduğunu gösterir.<br />
<strong><br />
The Pool of Parallel Slave Processes</strong></p>
<p>Oracle instance’ı başladığında  açılışında sayısı  PARALLEL_MIN_SERVERS  ile belirtilen parametre ile parallel execution servers için pool yaratır. Parallel Operasyon çalıştırıldıgında coordinator parallel execution servers ları  pooldan  alır ve göreve atar.Statment bittikten sonra processler poola döner. Sql statement alıştırıldıgında optimizer parallel olup olmayacağına ve  paralleligin derecesine  DOP(degree of parallelism) ‘a gore karar verir.</p>
<p>Slave processlerin sayısı paralleligin derecesiyle belirlenir. Oracle paralleligi iki component den oluşur. Birincisi kullanılacak instance sayısı ikincis her instance daki slave process sayısı. Parallelik derecesi Statement level , Object level, Instance level gibi  3 level da belirlenir.  Oracle hint ya da parallel clause kullanan statement level’a bakar birşey bulamazsa  objct level da tablo ya da indekse bakar orda da dışardan değer verilmemişse instance için verilmiş default değeri uygular. SELECT /*+ PARALLEL(orders,4,1) */ COUNT(*) FROM orders; gibi hintle statement level bazında belirlemiş oluruz. ALTER TABLE order_items PARALLEL (DEGREE 4); dersek object level bazında belirlemiş oluruz.</p>
<p><strong>Parallel DDL</strong></p>
<p>Parallel DDL partitioned ve nonpartitioned tablo ve indekslerde çalışır. CREATE TABLE&#8230;AS SELECT, CREATE INDEX, ALTER INDEX&#8230;REBUILD  gibi nonpartitioned ya da  ALTER TABLE&#8230;MOVE PARTITION, ALTER INDEX&#8230;REBUILD PARTITION  partitioned tablo ya da indekslerde paralelleştirilebilinir. Kısıtlama olarak  Object kolonları  ya da LOB kolonları paralelleştirilemez.</p>
<p><strong>Parallel Data Loading</strong></p>
<p>Oracle&#8217;s SQL*Loader parallel olarak  belli kısıtlamlar dahilinde harici dosyalardan data load etmemize izin verir. Eger çok fazla data load edecekseniz sql loaderın parallel gerçekleştirmesi elapsed time’ı düşürecektir. Paralel loading de birden çok path tanımlayarak aynı tabloya ya da tablonun aynı bölümüme data load edebilirsiniz.<br />
Bunun için birden fazla input datafile, her datafile için control file ve her control file ve datafile için bir sqlloader oturumu açmanız yeterli olacaktır. Örnekleycek olursak:</p>
<p>SQLLOAD scott/tiger CONTROL=con1.ctl DIRECT=TRUE PARALLEL=TRUE<br />
SQLLOAD scott/tiger CONTROL=con2.ctl DIRECT=TRUE PARALLEL=TRUE<br />
SQLLOAD scott/tiger CONTROL=con3.ctl DIRECT=TRUE PARALLEL=TRUE<br />
SQLLOAD scott/tiger CONTROL=con4.ctl DIRECT=TRUE PARALLEL=TRUE</p>
<p><strong>Parallel Recovery</strong></p>
<p>Seri recovery de SMON backgroung process’i  hem redologları okur ve değişiklikleri datafile ‘a yazar .Recovery için birden fazla datafile gerektiğini düşünürsek seri işlem oldukça zaman alacaktır. Parallel Recovery de SMON redo logları okur ve multiple parallel slave processes ler  datafile lara yazar ve böylece recovery zamanı düşer.</p>
<p>RECOVER TABLESPACE tab PARALLEL (DEGREE 4);</p>
<p><strong>Procedural Parallelism</strong></p>
<p>İki türlü procedural parallelism bunlar parallel pipelined functions ve do-it-yourself parallelism DIY .Bunlardan pipelined fonksiyonları örneklendirelim.. Bir  seri çalışan batch process prosedürmüz var.</p>
<p>Create procedure  process_data<br />
As<br />
Begin<br />
For x in(select * from some_table)<br />
Perform complex process on X<br />
Update some other table ,insert into somewhere else<br />
End loop<br />
End;</p>
<p>Bu prosedür sistem kaynaklarını çok kullanmadığını düşünün ve  çalışması saatlerce sürüyor . Runtime da zamanı düşürmek istiyoz bunu yukarda bahsettiğim iki yaklaşımla çözmeye çalışalım.<br />
<strong><br />
Parallel Pipelined Functions</strong></p>
<p>Data önceden çalışan process_data prosedürünü parallelleştirelim.Bunu gerçekleştimek için bir tablodan seçip onu işleyip başka tabloya insert etmek yerine loopdaki insert yerine PIPE ROW koyup,sonucu başka tabloya koyup orda işlemeye çalışalım.İki tablo kullanacağız birincisi t1 daha önceden okudugmuz tablo ikincisi ise taşıyacağımız tablo t2 olsun.</p>
<p>Create table t1<br />
As select object id ,object_name text<br />
From all_objects;</p>
<p>Create table t2 as<br />
Select t1.*,0 session_id<br />
From t1<br />
Where 1=0;</p>
<p>T2  tablosunu t1 ile aynı yapıda yarattık. Session_id ile parallelismi görmek için ekledik. Sonra pipelined fonksiyonun döndüreceği output type’ı yarattık.</p>
<p>Create or replace type t2_type<br />
As object</p>
<p>(<br />
Id number ,<br />
Text varchar2(30),<br />
Session_id number</p>
<p>)</p>
<p>Create or replace type t2_tab_type<br />
As table of t2_type</p>
<p>Yazacağımız fonksiyonda refcursor ile input alıp  t2_tab_type ‘a değer döneceğiz. Pipelined fonksiyonda parallel_enable durumda ve partition clause ile  datayı en ideal biçimde bölümleyerek getir diyoruz. Fonksiyonu yazıyoruz.</p>
<p>Create or replace  function parallel pipelined (l_cursor in sys_refcursor)<br />
Return t2_tab_type<br />
Pipelined parallel_enable (partition l_cursor by any)</p>
<p>Is</p>
<p>L_session_id number;<br />
l_rec t1%rowtype;<br />
begin<br />
select sid into l_session_id<br />
from v$mystat<br />
where rownum=1;</p>
<p>loop<br />
fetch l_cursor into l_rec;<br />
exit when l_cursor&amp;notfound;<br />
&#8212;complex process here<br />
Pipe row(t2_type(l_rec.id,l_rec.text,l_session_id));<br />
End loop;<br />
Close l_cursor;<br />
Return;<br />
End;</p>
<p>Datayı parallel işlemek için artık hazırız parallelik derecesini Oracle kaynak durumuna gore otomatik ayarlayacaktır.</p>
<p>Alter session enable parallel dml;</p>
<p>&gt;&gt;insert /* +append */<br />
into t2(id,text,session_id)<br />
Select * from table (parallel_pipelined(CURSOR (select /*+parallel(t1)*/* from t1)))</p>
<p>&gt;&gt; select session_id,count(*)<br />
From t2<br />
Group by session_id;</p>
<p>Session_id       count(*)</p>
<p>241	8040<br />
246	8045<br />
253	8042<br />
254	8042<br />
258	8040<br />
259	8041<br />
Yukarda gördüğümüz gibi Oracle dereceyi 6 olarak belirledi ve her bir slave process yaklaşık 8000 satır işledi.</p>
<p><strong>Instance Configuration<br />
</strong><br />
Parallel Execution’un size performans sağlayacağını düşündüğünüz durumlarda konfirigasyon çok da zor olmamaktadır. Eger session ALTER  SESSION FORCE PARALLEL … çalıştırılmışsan sql ler için derece CPU_COUNT ile belirtilen ve defaultda system cpu sayısı olan parallelikte çalışır.</p>
<p><strong>parallel_adaptive_multi_user</strong></p>
<p>Parallel execution da çok önemli parametrelerden biridir. Default olarak false gelir ve true olması tavsiye edilir. Bu parametreyi bir örnekle açıklayalım. Çok datadan rapor elde ediyorsunuz ve rapor almak yaklaşık 8 dk sürüyor ve siz dördüncü dereceden parallellikle çalıştırıp süreyi 2 dk ya düşürüyorsunuz. Sonra dereceyi biraz daha artırıp süreyi daha fazla düşürmek istiyorsunuz ama server kaynakları yeterli olmadıgından  rapor işlemini gerçekleştiremeyebilirsiniz işte Oracle bunun çözümü için bu adaptive_multi_user ‘I getirdi. Eger server meşgulse talep ettiğinizden daha düşük derecede çalışır parallel sorgularınız ve böylece overheadden kurtulmuş olursunuz.<br />
<strong><br />
parallel_max_servers and parallel_min_servers</strong></p>
<p>User process ile PX ler pooldan çağırılır bu iki parametre ile pool’un size’ını ayarlayabilirsiniz. Yine kritik olacak maksimum değeri olacaktır. Bu değeri yüksek verip bir cpu da yüzlerce process çalıştırmanın anlamı yoktur. Maksimum değeri cpu sayısının iki ya da dört katı verilebilinir ama sürekli üstünde durduğumuz gibi tüm etkenler üstünde düşünülmelidir.</p>
<p><strong>parallel_execution_message_size</strong></p>
<p>Bu parametre ile slave processler ile coordinator arasındaki	mesajların geçmesindeki buffer miktarı ayarlanır. Defaultda 2 KB gelir. Eger mesajlar değerden büyükse parçalara ayrılır bu az da olsa etkiler performansı. parallel_automatic_tuning tarafında mesajlar 2kb dan 8kb ye kadar çıkarılabilinir.</p>
<p>Bu parametreler ayarlamak dışında dışında data dictionary viewden de processler hakkında kolayca bilgi alabiliriz. Aslında birçok uzmanda bu parametrelerin farkında değildir. Şimdi bazılarına göz atalım.</p>
<p>V$PQ_SESSTAT</p>
<p>Sorgumuzun parallelliğini görmmemiz açısından faydalı olacaktır ayrıca mesaj aktivitelerini de görebiliriz.</p>
<p>SELECT * FROM v$pq_sesstat;</p>
<p>STATISTIC                      LAST_QUERY SESSION_TOTAL<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;-<br />
Queries Parallelized                    1             2<br />
DML Parallelized                        0             0<br />
DDL Parallelized                        0             0<br />
DFO Trees                               1             2<br />
Server Threads                          7             0<br />
Allocation Height                       7             0<br />
Allocation Width                        1             0<br />
Local Msgs Sent                       491           983<br />
Distr Msgs Sent                         0             0<br />
Local Msgs Recv&#8217;d                     491           983<br />
Distr Msgs Recv&#8217;d                       0             0</p>
<p>Kullanılan px processlerin sayısını ve durumunu görmemiz açısında faydalı olacaktır. Aynı zamanda parallel_max_servers ve parallel_min_servers parametrelerini ayarlamak açısıdan yararlı olacaktır.Unix de |ps -ef|grep &#8220;ora_p&#8221; da aynı sonucu döndürecektir.</p>
<p>select<br />
statistic,<br />
value<br />
from<br />
v$pq_sysstat<br />
where<br />
statistic = &#8216;Servers Busy&#8217;;</p>
<p>STATISTIC         VALUE<br />
&#8212;&#8212;&#8212;                &#8212;&#8211;<br />
Servers Busy           30</p>
<p>Monitoring the SQL being executed by slaves</p>
<p>Slave processlerin hangi sql li çalıştırdığını da viewleri joinleyerek bakabiliriz. Burda processler aktif olmak zorundadır.</p>
<p>select p.server_name,<br />
sql.sql_text<br />
from v$px_process p, v$sql sql, v$session s<br />
WHERE p.sid = s.sid<br />
and p.serial# = s.serial#<br />
and s.sql_address = sql.address<br />
and s.sql_hash_value = sql.hash_value</p>
<p>P000 SELECT /*+ PARALLEL (attendance, 2) */ * FROM attendance ORD<br />
ER BY amount_paid</p>
<p>P003 SELECT /*+ PARALLEL (attendance, 2) */ * FROM attendance ORD<br />
ER BY amount_paid</p>
<p>P002 SELECT /*+ PARALLEL (attendance, 2) */ * FROM attendance ORD<br />
ER BY amount_paid</p>
<p>P001 SELECT /*+ PARALLEL (attendance, 2) */ * FROM attendance ORD<br />
ER BY amount_paid</p>
<p>Session Tracing and Wait Events</p>
<p>Parallel execution kullanan bir uygulamayı trace etmek kullanmayana gore daha birkaç yönüyle daha karmaşıktır. Trace file her slave process için üretilir. Versiyona gore değişse de slave processlerin trace dosyaları background_dump_dest de query coordinator trace leri ise user_dump_dest de oluşur. Processler arasında mesaj alışverişleri beklemelere yol açar. En büyük zorluklardan biri de çok sayıda analiz etmeniz gereken trace dosyası olmasıdır.</p>
<p><strong>Parallel-specific Wait Events</strong></p>
<p>Px leri monitor ederken high level da statspack (istatistik görebileceğiniz bir tool) low level da ise event trace kullanabilirsiniz.</p>
<p>Events indicating Consumers are waiting for data from Producers</p>
<p>Daha once bahsettiğimiz consumer’ın producer’i beklemesinden dolayı beklemeler aslında herhangi bir process’in çalışması için diğer processi beklemesinden farklı değildir. Ama bu beklemler çok fazla sürüyorsa bu bir problem göstergesidir. Aşağıda statpacks ile alınmış topten events var ona bakıp yorumlarda bulunalım.</p>
<p>Event                          Waits   Timeouts   Time (s)   (ms)     /txn<br />
direct Path read            2,249,666          0    115,813     51     25.5<br />
PX Deq: Execute Reply553,797     22,006     75,910    137      6.3<br />
PX qref latch               77,461     39,676     42,257    546      0.9<br />
library cache pin           27,877     10,404     31,422   1127      0.3<br />
db file scattered read   1,048,135          0     25,144     24     11.9</p>
<p>Yukardaki değerlere yorumlarsak direk Path read slave processlerin fullscan ya da index full scan yaparken okuma şeklidir. Yukardaki istatistiğin datawarehouse da  uzun sure alan bir select oldugu düşünülürse 51 ms çok uzun sure değildir.  Execute Reply bir idle process olarak algılanır ve bize çok fakir vermez. PX qref latch  değeri bize consumer’ın producer’I beklediğini ve consumerın işleyemeyeceği kadar data getirdiği fikrini verir. Bu işlem çok fazla süren batch işlemioldugu için büyük miktarda mesaj transferinin oldugu görülmektedir. Wait events’I düşürmek için  parallel_execution_message_size  ‘ düşürmek ya da DOP derecesini düşürmek çözüm olabilir. Bu durum bilinçsizce DOP u artırarak her zaman hızlanacağını düşünenler tarafında karşılaşılabilinir bir durumdur. Ama asıl yukardaki sorun<br />
library cache pin  daki değerdeki sorundur. Bu parametre kodun library cache load edilirken göterdiği bekleme değeridir  ya da bir başka deyişle library cache  concurrency ‘i yöneten değerdir ve shared pool’un yogun kullanıldığı durumlarda yüksek değerde bir değer alacağınız kesindir.</p>
<p>Events indicating producers are quicker than consumers (or QC)</p>
<p>PX qref latch Consumer  processin data beklemesinden oluşan beklelerdir.  Bu durumda ise  parallel_execution_message_size ‘ı artırmak iletişim overhead’ı azaltıp consemer’ın  data beklemesini azaltıp haliyle toplam beklemyi de azaltacaktır.</p>
<p>Synchronisation Message Events</p>
<p>•	PX Deq Credit: need buffer<br />
•	PX Deq: Signal Ack<br />
•	PX Deq: Join Ack</p>
<p>Yukardaki gibi QC nin ve slave processlerin haberleşmesinden kaynaklanan beklemelerle karşılaşabilirsiniz bu durumda DOP ve parallel_max_servers değerlerini düşürmeniz yararlı olacaktır.</p>
<p>Query Coordinator waiting for the slaves to parse their SQL statements</p>
<p>•	PX Deq: Parse Reply SQL lin parse etmesinde gerçekleşen beklemerdir. Bu beklemeler library cache pin  değerlerine de yansır.</p>
<p>Partial Message Event</p>
<p>•	 PX Deq: Msg Fragment  bu event  parallel_execution_message_size ‘ın düşük olmasından kaynaklanır. Mesajların processler arasında taşınırken  büyük gelip bölümlere ayrılmasından kaynaklanabilir mesaj size’ı dşürüp tecrübe edilmesinde yarar vardır.</p>
<p>Şimdi de teknik alandan çıkıp genel  resmi özetleyelim.</p>
<p>•	Parallel execution kullanmadan once araştırmalı eger imkan varsa initial testler yapılmalıdır aksi halde büyük problemlerle karşılaşabilinir.<br />
•	Parallel Execution donanımı en yoğun kullanmak için tasarlanmıştır. Tek cpu, iki 512 MB lik disk le çok büyük performans artışı beklemek yanlış olacaktır.<br />
•	Parallel Execution kullanırken once sql tune edin edin kötü yazılmış ve tasarlanmış uygulamaya parallel execution uygulamaya kalkmayın.<br />
•	Kısa süren transactionlarda PX kullanmanız çok az iyileşmeye hatta daha yavaş çalışmaya mahkum olabilir. Kısa sorgu için tüm kaynakları kullanmış olursunuz.<br />
•	Parallel Executions geceyarıları batch operasyonları için ya da multiple streams joblarında genelde performans gösterir ama yine de bu uygulamanın türüne bağlıdır.<br />
•	Create as Select ya da büyük bulk insert into parallel olarak gerçekleştiriliyorsa NOLOGING modunda çalışırsa performans artar çünkü redo log’a yazdıgınız herşey extra I/O  dur aslında  ama recovery durumunda logları manuel olarak oluşturmanız gerekecektir.<br />
•	PARALLEL_AUTOMATIC_TUNING parametresini true yapın</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=22&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2007/09/21/parallel-execution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>Oracle Content Management (içerik yönetimi)</title>
		<link>http://baranipek.wordpress.com/2007/09/17/oracle-content-management-icerik-yonetimi/</link>
		<comments>http://baranipek.wordpress.com/2007/09/17/oracle-content-management-icerik-yonetimi/#comments</comments>
		<pubDate>Mon, 17 Sep 2007 12:27:40 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/2007/09/17/oracle-content-management-icerik-yonetimi/</guid>
		<description><![CDATA[Content Management
Oracle relational modeli (structured data) desteklemesinin yanında complex structured (collections,types), semi-structured (Advence Queuing)  object relational model tiplerini de desteklemektedir. Bugün daha çok unstructured data tiplerini üzerinde duracağız.
Günümüzde internetin de yaygınlasıyla video,foto gibi formatlarında kullanımı artmış ve veritabanı uygulamarının da vazgeçilmez ihtiyacı haline gelmiştir. Bunun için artık bizim örneklemede sürekli kullandığımız employees tablosunun içinde [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=10&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Content Management</strong></p>
<p>Oracle relational modeli (structured data) desteklemesinin yanında complex structured (collections,types), semi-structured (Advence Queuing)  object relational model tiplerini de desteklemektedir. Bugün daha çok unstructured data tiplerini üzerinde duracağız.</p>
<p>Günümüzde internetin de yaygınlasıyla video,foto gibi formatlarında kullanımı artmış ve veritabanı uygulamarının da vazgeçilmez ihtiyacı haline gelmiştir. Bunun için artık bizim örneklemede sürekli kullandığımız employees tablosunun içinde artık ilk employeenin fotosunu görmek isteyebilirsiniz  Oracle unstructed datayı kendi native datası olarak görür ve yönetimi için toollar sağlar ve bütün tipler bir sql cümleciği kadar yakın ve hızlıdır.</p>
<p><strong>XML in Oracle</strong></p>
<p>XML DB xml’in depolanması,yönetilmesi ve sql ve xml modelinin sağlanması için oracle teknolojisidir. Ayrı bir server olarak düşünülmemesi gerekir. Xml Db xml&#8217;e native data type ‘ı gibi davranır. Database de xmltype olarak tutulur ve getClobVal() ile select çekebilirsiniz. Dönen değer clob değeridir ve pl/sql ile DBMS_LOB.freeTemporary() metodunda çağırabilirsiniz. Xmltype object tipidir yani tablo yaratabilirsiniz ve xml içeriği clob olarak tutulur ve çekilir. XML DB xml için sql ile ulaşılabilecek repository sağlar. Xml&#8217;e ftp,http gibi protokoller ve sql,pl/sql,java ile ulaşabilirsiniz</p>
<p><strong>Overview of LOB Datatypes</strong></p>
<p>BLOB, CLOB, NCLOB, and BFILE unstructed verinin binary ya da karakter olarak saklanmasını ve işlenmesini sağlar. BLOB veritipi veritabanında binary unstructured veriyi tutar. 8 terabyte binary veri tutar.CLOB character data set NCLOB da Unicode character setidir. BFİLE  file sistemlerde binary veri tipidir .Read only dir .</p>
<p><strong>Oracle text</strong></p>
<p>Oracle text  Oracle domain indeksleridir. Oracle Text, veritabanında saklanan metinlerin içeriklerinin indekslenmesi ve bu indekslerin üzerinden içerige dayalı gelişmiş sorgulamalar yapılmasına olanak verir. MS Office, Adobe PDF, HTML ve XML gibi 150 döküman tipini ve 40’tan fazla dili destekler. Oracle text veritabanına integredir ve  oracle processi olarak çalışır. Oracle text  web de ,database de , ya da dosyadaki dökümanları analiz,search,indeklerken standart sql kullanır. Oracle text kullanılırken textin kullanılacağı kolonun uygun indeks seçilerek  indexlenir. Oracle text kullanmak CREATE INDEX yazıp tipini berlirtmek kadar kolaydır.Oracle text design ederken hangi tipte sorgu kullancağanız önemlidir. Böylece en uygun index’i seçmiş olursunuz .Çünkü her uygulama türü farklı indeks kullanır.<br />
Index types</p>
<p>Standart arama da metin eşleme yapılır. Dökümanlar document table da saklanır ve html,pdf,doc gibi  formatlarda olabilir. Bu tür dökümanlar CONTEXT index ile document table da saklanırlar. Sorgular kelime ya da phrases lerden oluşabilir. OR ve AND operatörleri kullanılabilinir. Sql ifadesi contains operatörü içerir. Cataloglama da ctxcat indeksi catsearch operatörü ile kullanılır.Mixed querylerde performance açısından daha iyidir. Context indekse gore daha fazla oluşturulurken ve kullanılırken daha fazla disk kullanımı gerçekleştirir. Ctxrule ise stream olarak gelen dökümanları daha önceden belirlenmiş kurallara gore sınıflayarak  diğer tablolara</p>
<p>İntermedia</p>
<p>Intermedia Resim SesVideo gibi nesnesel objeleri depolayan yöneten Oracle uygun, etkin ve etkili relational model dışında blob,image,video gibi  complex objelere destek vererek object relational modele destek veren teknolojisidir.. Oracle ORDAudio, ORDImage, ORDVideo  gibi object typelarına destek vererek orta katmamın objeyi kullanamasını ve işlemesini destekler. Obje tiplerini create table olarak yarabilirsiniz yani varchar2 kolon yaratmaktan farkı yok. Media ortam verisi metadata objenin uzunluğu compression type vb Methots da objenin üzerinde gerçeleşebilcek procedürler getContent( ) and setProperties( ).</p>
<p>İntermedia objeleri ya internal blob olarak  ya da url si tutularak http serverda external olarak tutulur.External olarak tutulması consistency açısından sakıncalıdır. Kullanıcı tarafından farklı lokasyonlara konulursa ulaşılamama durumuyla karşılalbilinir. SQL, PL/SQL, OCI, or Java  ile multimedia objelerine ulaşabilir ve işleyebilirsiniz. Java servlets,jsp lerdeki classlarla intermedia objelerine ulaşabilirsiniz. Java ıntermedia classes jai databasede deki intermedia objelerinden ordimage I yazar ve okur.<br />
<strong>Content-Based Retrieval</strong></p>
<p>Içerik temelli sunum sadece image ler için geçerlidir. Içerik temeli sunum  imaged-based bilgisini almada zamani azaltir. Büyük veritabanlarinda her update ve insertde  gibi sorgularda image’in özelliklerini getirmek pratik degildir. Içerik temelli sunum objenin color,shape,texture gibi özellikleri getirmede pratiklik saglar.</p>
<p>Content base retrival resmin içerigi soyutlar ve daha compact halde veritabanina insert edilir. Sorgular bu abstraction üzerinden çalışır. Böylece resim analiz edilir  resmi temsil eden vektörler olusturulur buna signature denir. Signature rengi ,sekli  gibi image’in özelliklerini saklar. Signature’lar image’i  renklere göre bölümlere ayırır ve her bir bölüm 3000 &#8211; 4000  arasında bytelardan oluşur.  Daha iyi performace için index-based signature kullanılabilinir. Şekilde görüldüğü gibi signature</p>
<p>Bu indeksler ORDImageIndex olarak geçiyor. Her update ve insert işleminde işleminde inkdes kendini update eder. Default olarak image search işlemlerinde signature lar karşılaştırılır fakat bu linear search milyonlarca image ‘in olduğu veritabanlarında performance kaybı olarcaktır. Bunda dolayı Indeksler işimizi kolaylaştırcaktır.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=10&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2007/09/17/oracle-content-management-icerik-yonetimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>
	</item>
		<item>
		<title>Analytic Functions</title>
		<link>http://baranipek.wordpress.com/2007/08/10/analytic-functions/</link>
		<comments>http://baranipek.wordpress.com/2007/08/10/analytic-functions/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 23:25:13 +0000</pubDate>
		<dc:creator>baranipek</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://baranipek.wordpress.com/2007/08/10/analytic-functions/</guid>
		<description><![CDATA[Analitik Fonksiyonlar
ilk Oracle 8 ailesi tarafından traditional sql’in kümülatif toplamlar,ranking,lead,lag gibi analitik hesaplarındaki eksiliklerini kapatmak için sağlananan sql extensionudur. Data warehousing işlemlerinde çok sık kullanılmasının yanısıra OLAP raporlamada da önemli rol oynamaktadır. Yaklaşık 26 fonksiyon civarında olup AVG ,RANK,DENSE_RANK, FIRST_VALUE, LAST_VALUE,ROW_NUMBER STDDEV,VARIANCE en yaygın kullanılan fonksiyonlarından birkaçıdır. Analitik fonsiyonların faydaları performans artışı, yazım kolaylığı ve [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=4&subd=baranipek&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Analitik Fonksiyonlar</strong></p>
<p>ilk Oracle 8 ailesi tarafından traditional sql’in kümülatif toplamlar,ranking,lead,lag gibi analitik hesaplarındaki eksiliklerini kapatmak için sağlananan sql extensionudur. Data warehousing işlemlerinde çok sık kullanılmasının yanısıra OLAP raporlamada da önemli rol oynamaktadır. Yaklaşık 26 fonksiyon civarında olup AVG ,RANK,DENSE_RANK, FIRST_VALUE, LAST_VALUE,ROW_NUMBER STDDEV,VARIANCE en yaygın kullanılan fonksiyonlarından birkaçıdır. Analitik fonsiyonların faydaları performans artışı, yazım kolaylığı ve kolay anlaşılabilirliği olarak sıralanabilinir. Birazdan örneklerle faydalarını göreceğiz.</p>
<p>Sorgularımızı analiz ederken Tkprof kullancağız .Onun için Tkprof anlamaya çalışalım.Command line’a tkprof yazarak kullanımını görebiliriz. Tkprof sorgularımızı analiz ederken trace dosyalarımızı kullanıp daha okunaklı rapor almamızı sağlar. Show parameter user_dump_dest<span style="font-family:Verdana;color:blue;"> görebiliriz. Ben </span><strong><span style="font-family:Verdana;color:black;">alter system set user_dump_dest=”d:sqltrace</span></strong><span style="font-family:Verdana;color:black;">”;</span><span style="font-family:Verdana;color:blue;"><span>  </span></span><span style="font-family:Verdana;color:black;">diyerek defaultda <strong>udump</strong> dosyasına atılacak trace dosyamın yerini değiştirdim.</span><span style="font-family:Verdana;"> <strong><span style="color:black;">Alter session set sql_trace = true;</span><span style="color:blue;"> </span></strong><span style="color:black;">komutuyla </span><span style="color:blue;"><span> </span></span><span style="color:black;">trace’i aktif hale getiriyorum fakat istatistik aldıktan sonra <strong>Alter session set events <em>&#8216;</em>10046 trace name context off<em>&#8216;</em>;</strong> komutuyla <span> </span>off duruma getirilmelidir .Aksi halde dosyamız şişer . <strong>Alter session set timed_statistics = true</strong></span><span style="color:blue;">; </span><span style="color:black;">diyerek raporuma CPU değerlerini ekledim. Sorgu performansında<span>  </span>bu değeri çok<span>  </span>kullanacağım.</span><span style="color:blue;"> </span><strong><span style="color:black;">Alter session set max_dump_file_size =unlimited;</span></strong><span style="color:blue;"> </span><span style="color:black;">deyip trace ‘i limitsiz yaptım .</span><span style="color:blue;"> </span><span style="color:black;">Şu anda<span>  </span><strong>XE</strong> için<span>  </span>çok kritik olmadığı için limitsiz yapıyorum ama normalde 50-100 MB yeterli bir miktar </span><span style="color:blue;"><span> </span></span><span style="color:black;">ve</span><span style="color:blue;"> </span><strong><span style="color:black;">alter session set statistics_level = all ;<span>  </span></span></strong><span style="color:black;">deyip her level da rapor almak istedim.<br />
Şimdi tekrar analitik fonksiyonlara dönelim. Analitik fonksiyon kıyaslamasında Scott’ın ünlü emp tablosu kullanılacak daha çok ename,sal ve deptno kolonlarını analiz edeceğiz. Emp tablosunda aynı departmanda en çok kazanan 3 kişi alacak Top-N sorgusu yazalım. Bunu bir analitik,bir de traditional sql ile yazıp performansları kıyaslayalım.</span></span></p>
<pre><span style="font-family:Verdana;color:black;"> </span></pre>
<pre><strong><span style="font-family:Verdana;color:black;"> </span></strong></pre>
<pre><!--[if !supportLineBreakNewLine]-->

<!--[endif]--><span style="font-family:Verdana;color:blue;"></span></pre>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">set timing on</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">set serveroutput on</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter session set max_dump_file_size=unlimited;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">ALTER session SET timed_statistics = true; </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter session set STATISTICS_LEVEL = ALL ;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter system flush shared_pool;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter system flush buffer_cache;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter session set tracefile_identifier = </span></em></strong><strong><em><span style="font-size:10pt;font-family:Verdana;color:red;">analytics</span></em></strong><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> ;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">alter session set events &#8216;10046 trace name context forever,all&#8217;;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">select * from</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>              </span>(select deptno,ename,sal,dense_rank()</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                      </span>over(partition by deptno order by sal desc)</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                           </span>top_three from hr.emp )</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                               </span>where top_three &lt;=3</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                                   </span>order by deptno,sal desc;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:blue;">Alter session set events &#8216;10046 trace name context off&#8217;;</span></em></strong></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Elapsed; 00:00:00.21</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span><span> </span>Dedikten sonra sqlrace dosyamda ora_exe_(SID)_analytics.trc isimli trace dosyam oluştu. Daha okunaklı hale gelitmek için command line’a<span>  </span><strong>D:\sqltrace&gt;tkprof<span>  </span>xe_ora_940_analytics.trc<span>  </span>analytics.txt<span>  </span>explain=sys/ sys=yes waits=yes sort=prscpu </strong>yazdıktan sonra aşağıdaki okunaklı şekilde istatistik <span> </span>alıyoruz.</span></p>
<p class="MsoNormal" style="text-indent:27pt;margin:0 -0.75in 0.0001pt -0.5in;"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></strong></p>
<table class="MsoTableGrid8" style="border:medium none;background:#ffff99 none repeat scroll 0 50%;border-collapse:collapse;" border="1" cellpadding="0" cellspacing="0">
<tr>
<td style="border:1pt solid navy;width:6.15in;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></strong></p>
</td>
</tr>
<tr>
<td style="background:#e6e6e6 none repeat scroll 0 50%;width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span> </span><span> </span>DEPTNO<span>          </span><span>        </span>ENAME<span>  </span><span>         </span><span>               </span>SAL<span>                             </span>TOP_THREE<span>                               </span><span>    </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>                 </span><span>    </span><span>         </span><span> </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>                             </span>KING<span>                             </span>5000<span>                                   </span><span>        </span>1<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>                            </span>CLARK<span>                            </span>2450<span>              </span><span>                    </span><span>        </span><span> </span>2<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>                            </span>MILLER<span>                          </span>1300<span>                                  </span><span>         </span>3<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                            </span>SCOTT<span>                            </span>3000 <span>                                </span><span>        </span><span>  </span>1<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                            </span>FORD<span>                              </span>3000<span>                                   </span><span>      </span><span> </span>1<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                            </span>JONES<span>                   </span><span>         </span>2975<span>                                    </span><span>       </span>2<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                          </span><span> </span><span> </span>ADAMS<span>                           </span>1100<span>                                    </span><span>       </span>3<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                           </span>BLAKE<span>       </span><span>                     </span><span> </span>2850<span>                                   </span><span>       </span><span> </span>1<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                           </span>ALLEN<span>                            </span><span> </span>1600<span>                                   </span><span>      </span><span>  </span>2<span>                      </span></span></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 navy navy;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                         </span><span>  </span>TURNER<span>                         </span><span> </span>1500<span>                                    </span><span>      </span><span> </span>3<span>                      </span></span></strong></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">10 rows selected</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<table class="MsoTableClassic4" style="border:medium none;background:blue none repeat scroll 0 50%;border-collapse:collapse;" border="1" cellpadding="0" cellspacing="0">
<tr>
<td style="width:6.15in;border-color:black;border-style:solid;border-width:1.5pt 1pt 1pt;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><em><span style="font-size:10pt;font-family:Verdana;color:black;">call<span>     </span>count<span>       </span>cpu<span>      </span>elapsed<span>       </span>disk<span>      </span>query<span>      </span>current<span>        </span>rows</span></em></strong></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 black;border-style:none solid;border-width:medium 1pt;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Parse<span>        </span>1<span>        </span><span> </span>0.03<span>       </span>0.14<span>          </span><span> </span>2<span>            </span>2<span>          </span><span>   </span>0<span>            </span><span>          </span><span> </span>0</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 black;border-style:none solid;border-width:medium 1pt;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Execute<span>    </span>1<span>        </span><span> </span>0.00<span>        </span>0.00<span>           </span>0<span>          </span>0<span>          </span><span>   </span>0<span>             </span><span>          </span>0</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;border-color:#000000 black;border-style:none solid;border-width:medium 1pt;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Fetch<span>        </span>2<span>       </span><span> </span><span> </span>0.00<span>         </span>0.02<span>           </span>0<span>           </span>7<span>          </span><span>   </span>0<span>            </span><span>          </span>10</span></p>
</td>
</tr>
<tr>
<td style="background:yellow none repeat scroll 0 50%;width:6.15in;border-color:#000000 black black;border-style:none solid solid;border-width:medium 1pt 1pt;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">total<span>      </span><span>  </span>4<span>       </span><span>  </span><span> </span><strong>0.03</strong><span>       </span>0.17<span>           </span><strong>2</strong></span><strong><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></strong><span style="font-size:10pt;font-family:Verdana;color:blue;"><span> </span></span><span style="font-size:10pt;font-family:Verdana;color:black;"><span>        </span><strong>9</strong></span><span style="font-size:10pt;font-family:Verdana;color:red;"> </span><span style="font-size:10pt;font-family:Verdana;color:black;"><span>        </span><span>   </span><span> </span>0<span>           </span><span>          </span><span> </span>10</span></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Misses in library cache during parse: 1</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Optimizer mode: ALL_ROWS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Parsing user id: SYS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Rows<span>     </span>Row Source Operation</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">&#8212;&#8212;-<span>  </span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>10<span>  </span>VIEW<span>  </span>(cr=7 pr=0 pw=0 time=28703 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>   </span>WINDOW SORT PUSHED RANK (cr=7 pr=0 pw=0 time=28615 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>    </span>TABLE ACCESS FULL EMP (cr=7 pr=0 pw=0 time=160 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Şimdi aynı çıktıyı sonucu<span>  </span>analitik fonksiyon kullanmadan alacağım.</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:blue;">select deptno,ename,sal from<span>  </span>hr.emp e1</span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>   </span>where sal in (select sal from(<span>  </span></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>          </span>select distinct sal,deptno from hr.emp e3 order by deptno,sal desc) e2</span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                </span>where e2.deptno=e1.deptno and rownum &lt;=3) </span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>                     </span>order by deptno,sal desc;</span></strong></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Elapsed:00:00:00.25</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<table class="MsoTable3DFx2" style="border-collapse:collapse;" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="background:blue none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">call<span>       </span>count<span>       </span>cpu<span>    </span>elapsed<span>       </span>disk<span>      </span>query<span>      </span>current<span>        </span>rows</span></strong></p>
</td>
</tr>
<tr>
<td style="background:blue none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Parse<span>        </span>1<span>        </span>0.03<span>         </span>0.04<span>          </span>2<span>          </span>5<span>             </span>0<span>                 </span>0</span></strong></p>
</td>
</tr>
<tr>
<td style="background:blue none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Execute<span>    </span>1<span>        </span>0.00<span>         </span>0.00<span>       </span><span>   </span>0<span>            </span>0<span>             </span>0<span>                 </span><span> </span>0</span></strong></p>
</td>
</tr>
<tr>
<td style="background:blue none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Fetch<span>        </span>2<span>        </span>0.01<span>         </span>0.00<span>          </span>0<span>         </span>91<span>            </span>0<span>                </span><span> </span>10</span></strong></p>
</td>
</tr>
<tr>
<td style="background:yellow none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">total<span>         </span><strong>4<span>        </span>0.04<span>       </span>0.04<span>         </span></strong></span><strong><span style="font-size:10pt;font-family:Verdana;color:red;"><span> </span></span></strong><strong><span style="font-size:10pt;font-family:Verdana;color:black;">2<span>           </span>96</span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>         </span><span>  </span>0<span>                </span><span> </span>10</span></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Misses in library cache during parse: 1</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Optimizer mode: ALL_ROWS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Parsing user id: SYS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Rows<span>     </span>Row Source Operation</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">&#8212;&#8212;-<span>  </span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>10<span>  </span>SORT ORDER BY (cr=91 pr=0 pw=0 time=4254 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>10<span>   </span>FILTER<span>  </span>(cr=91 pr=0 pw=0 time=4121 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>    </span>TABLE ACCESS FULL EMP (cr=7 pr=0 pw=0 time=137 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>      </span>9<span>    </span>FILTER<span>  </span>(cr=84 pr=0 pw=0 time=3749 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>27<span>     </span>COUNT STOPKEY (cr=84 pr=0 pw=0 time=3580 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>27<span>      </span>VIEW<span>  </span>(cr=84 pr=0 pw=0 time=3275 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>27<span>       </span>SORT UNIQUE STOPKEY (cr=84 pr=0 pw=0 time=2930 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>59<span>        </span>TABLE ACCESS FULL EMP (cr=84 pr=0 pw=0 time=916 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:red;"><span>                          </span><span>          </span></span></strong><strong><span style="font-size:10pt;font-family:Verdana;color:black;">CPU<span>                        </span>I/O (Kaynak kullanımı disk+query)</span></strong><strong><span style="font-size:10pt;font-family:Verdana;color:red;"></span></strong></p>
<table class="MsoTableWeb2" style="border:1pt inset;" border="1" cellpadding="0" cellspacing="3">
<tr style="height:46.9pt;">
<td style="border:1pt outset;width:95.15pt;height:46.9pt;padding:0 5.4pt;" valign="top" width="127">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Analytics</span></strong></p>
</td>
<td style="border:1pt outset;width:123.9pt;height:46.9pt;padding:0 5.4pt;" valign="top" width="165">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal" style="text-align:center;" align="center"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">0.03</span></strong></p>
</td>
<td style="border:1pt outset;width:219.05pt;height:46.9pt;padding:0 5.4pt;" valign="top" width="292">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal" style="text-align:center;" align="center"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">11</span></strong></p>
</td>
</tr>
</table>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></strong></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal" style="margin-left:-0.25in;"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal" style="margin-left:-0.25in;"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>            </span>Yukarda çalıştırdığım iki sorgu da bana her departmanın en çok kazanan <span> </span>üç <span> </span>kişisini getirdi. İstatistikleri karşılaştırdığımda yukardaki gibi bir tabloyla karşılaştım. Analitik fonksiyon<span>  </span>da<span>  </span>0.03 süresinde disk+query değerinin toplamı 11 <span> </span>I/O kaynak kullanımı gerçekleşirken <span> </span>analitik fonksiyon kullanmadığımda 0.04 süresince toplam<span>  </span>98 I/O kullanımı gerçekleşti. Bu da <span> </span>analitik fonksiyon kullanmadığımız durumlarda<span>  </span>fazladan kaynak kullanımı,yani performans kaybı <span> </span>olduğunu gösterdi. Ayrıca ikinci sorgumda<span>  </span>altsorgu her satır için çalıştı belki bu bizim 14 satırlık tablomuzda çok kritik gözükmemiş gibi olabilir ama milyonlarca satırdan oluşan tabloda çok önem kazanacağı ve yukardaki değerlerin arasında farkın artıp performans farkının daha artacağı kesin bir yargı olacaktır.</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>    </span>Şimdi bir örnek daha yapıp farkı tekrar görelim. Emp tablosunda her çalışanın adını ,maaşını,departmanın toplam maaşını alıp,çalışan maaşının departman ve toplam şirketteki maaşlarına gore yüzdesine bakalım. </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">select deptno,ename,sal,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">sum(sal) over (partition by deptno order by sal,ename) cum_sal,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">round(100*ratio_to_report(sal) over (partition by deptno),1) pct_dept,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">round(100*ratio_to_report(sal) over(),1) pct_overall</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">from emp</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">order by deptno,sal</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></em></p>
<p align="center">
<table class="MsoTableWeb3" style="border:3pt outset;" border="1" cellpadding="0" cellspacing="3">
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal" style="text-align:center;" align="center"><span style="font-size:10pt;font-family:Verdana;color:black;">DEPTNO<span>           </span>ENAME<span>      </span><span>     </span>SAL<span>            </span>CUM_SAL<span>       </span>PCT_DEPT<span>    </span>PCT_OVERALL</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>               </span><span>   </span>MILLER<span>              </span><span> </span>1300<span>             </span>1300<span>            </span><span>  </span><span> </span><span> </span>14.9<span>        </span><span>           </span><span> </span>4.5</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>                  </span>CLARK<span>            </span><span>    </span>2450<span>          </span><span>   </span>3750<span>               </span><span> </span><span> </span>28<span>          </span><span> </span><span>         </span>8.4</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">10<span>                    </span>KING<span>                  </span>5000<span>              </span>8750<span>               </span><span> </span>57.1<span>       </span><span>          </span><span> </span>17.2</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                  </span>SMITH<span>                 </span>800<span>             </span><span> </span><span> </span>800<span>              </span><span>   </span><span> </span>7.4<span>            </span><span>    </span><span>  </span>2.8</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                  </span>ADAMS<span>    </span><span>            </span>1100<span>             </span>1900<span>           </span><span>    </span><span> </span>10.1<span>         </span><span>       </span>3.8</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                 </span><span> </span>JONES<span>                </span><span> </span>2975<span>              </span>4875<span>            </span><span>   </span>27.4<span>          </span><span>       </span>10.2</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                 </span><span> </span>FORD<span>                  </span>3000<span>          </span><span>    </span>7875<span>             </span><span> </span><span>  </span>27.6<span>        </span><span>      </span>10.3</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">20<span>                  </span>SCOTT<span>          </span><span>       </span>3000<span>              </span>10875<span>          </span><span>   </span><span> </span>27.6<span>            </span><span>    </span>10.3</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                  </span>JAMES<span>                 </span>950<span>               </span><span> </span>950<span>              </span><span>    </span>10.1<span>          </span><span>    </span><span> </span>3.3</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                  </span>MARTIN<span>               </span>1250<span>              </span><span> </span>2200<span>            </span><span>   </span>13.3<span>          </span><span>      </span><span> </span>4.3</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                    </span>WARD<span>                  </span>1250<span>          </span><span>    </span>3450<span>             </span><span>   </span>13.3<span>         </span><span>      </span>4.3</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                  </span>TURNER<span>         </span><span>       </span>1500<span>             </span>4950<span>       </span><span>      </span><span>   </span><span> </span>16<span>            </span><span>      </span><span> </span>5.2</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                    </span>ALLEN<span>                  </span>1600<span>         </span><span>     </span>6550<span>             </span><span>  </span><span> </span>17<span>            </span><span>        </span>5.5</span></p>
</td>
</tr>
<tr>
<td style="width:6.15in;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">30<span>                  </span>BLAKE<span>                  </span>2850<span>          </span><span>    </span>9400<span>             </span><span>   </span>30.3<span>       </span><span>          </span>9.8</span></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>          </span><span>     </span><span>              </span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">14 rows selected</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Elapsed:00:00:00.97</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<table class="MsoTable3DFx2" style="border-collapse:collapse;" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">call<span>     </span>count<span>       </span>cpu<span>      </span>elapsed<span>       </span>disk<span>      </span>query<span>      </span>current<span>        </span>rows</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Parse<span>        </span>1<span>        </span>0.01<span>       </span>0.36<span>          </span>2<span>          </span>2<span>          </span><span> </span></span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span> </span>0<span>                 </span>0</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Execute<span>    </span>1<span>       </span></span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span> </span>0.00 <span>       </span>0.00<span>          </span>0<span>         </span>0<span>             </span>0<span>                 </span>0</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">Fetch<span>        </span>2<span>        </span></span></strong><span style="font-size:10pt;font-family:Verdana;color:black;">0.00<strong><span>       </span>0.03<span>          </span>0<span>          </span>3<span>          </span><span>  </span></strong>0<strong><span>          </span><span>       </span>14</strong></span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">total </span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>       </span><span> </span>4<span>        </span></span><strong><span style="font-size:11pt;font-family:Verdana;color:black;">0.01</span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>        </span>0.40<span>          </span></span><strong><span style="font-size:11pt;font-family:Verdana;color:black;">2<span>  </span></span></strong><strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>       </span></span></strong><strong><span style="font-size:11pt;font-family:Verdana;color:black;"><span> </span>5</span></strong><span style="font-size:10pt;font-family:Verdana;color:black;"><span>          </span><span> </span>0<span>           </span><span>     </span><span> </span><span>  </span><strong>14</strong></span></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Rows<span>   </span><span>  </span>Row Source Operation</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">&#8212;&#8212;-<span>  </span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>  </span>WINDOW SORT (cr=3 pr=0 pw=0 time=39283 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>   </span>TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=660 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:blue;"> </span></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">select emp.deptno,emp.ename,emp.sal,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">sum(emp4.sal) cum_sal,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">round(100*emp.sal/emp2.sal_by_dept,1) pct_dept,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">round(100*emp.sal/emp3.sal_overall,1) pct_overall</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">from emp,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>  </span>(select deptno, sum(sal) sal_by_dept from emp group by deptno) emp2,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>    </span>(select sum(sal) sal_overall from emp )emp3, </span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>      </span>emp emp4</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">where emp.deptno= emp2.deptno </span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span> </span>and emp.deptno=emp4.deptno </span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>        </span>and (emp.sal &gt; emp4.sal or (emp.sal=emp4.sal and emp.ename &gt;= emp4.ename))</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>          </span>group by emp.deptno,emp.ename,emp.sal,</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>          </span>round(100*emp.sal/emp2.sal_by_dept,1),</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>          </span>round(100*emp.sal/emp3.sal_overall,1)</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;"><span>          </span>order by deptno,sal</span></em></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<table class="MsoTable3DFx2" style="border-collapse:collapse;" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">call<span>       </span>count<span>       </span>cpu<span>    </span>elapsed<span>       </span>disk<span>      </span>query<span>      </span>current<span>        </span>rows</span></strong></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Parse<span>          </span>1<span>      </span>0.03<span>       </span>0.20<span>          </span>2<span>          </span>5<span>          </span>0<span>           </span>0</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Execute<span>        </span>1<span>     </span>0.00<span>       </span>0.00<span>          </span>0<span>          </span>0<span>          </span>0<span>           </span>0</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-color:gray gray white #000000;border-style:solid solid solid none;border-width:1pt 1pt 1pt medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Fetch<span>          </span>2<span>      </span>0.00<span>       </span>0.08<span>          </span>0<span>         </span>12<span>          </span>0<span>          </span>14</span></p>
</td>
</tr>
<tr>
<td style="background:silver none repeat scroll 0 50%;width:6.15in;border-style:none solid none none;border-width:medium 1pt medium medium;padding:0 5.4pt;" valign="top" width="590">
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;">total<span>          </span>4<span>      </span>0.03<span>       </span>0.28<span>          </span>2<span>         </span>17<span>          </span>0<span>          </span>14</span></strong></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Misses in library cache during parse: 1</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Optimizer mode: ALL_ROWS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Parsing user id: SYS</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">Rows<span>     </span>Row Source Operation</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;">&#8212;&#8212;-<span>  </span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>  </span>SORT GROUP BY (cr=12 pr=0 pw=0 time=81357 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>42<span>   </span>HASH JOIN<span>  </span>(cr=12 pr=0 pw=0 time=80646 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>42<span>  </span><span>  </span>HASH JOIN<span>  </span>(cr=9 pr=0 pw=0 time=2092 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>     </span>NESTED LOOPS<span>  </span>(cr=6 pr=0 pw=0 time=422 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>      </span>1<span>      </span>VIEW<span>  </span>(cr=3 pr=0 pw=0 time=235 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>      </span>1<span>       </span>SORT AGGREGATE (cr=3 pr=0 pw=0 time=219 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>        </span>TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=145 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>      </span>TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=84 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>     </span>TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=90 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>      </span>3<span>    </span>VIEW<span>  </span>(cr=3 pr=0 pw=0 time=58457 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>      </span>3<span>     </span>HASH GROUP BY (cr=3 pr=0 pw=0 time=58424 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>     </span>14<span>     </span><span> </span>TABLE ACCESS FULL EMP (cr=3 pr=0 pw=0 time=145 us)</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p class="MsoNormal" style="text-indent:0.5in;"><span style="font-size:10pt;font-family:Verdana;color:black;">Sonuçları kıyasladığımızda yine aynı yargılara ulaştık. Cpu değeri analitik de yine az çıktı ve I/O kullanımında fark yine açık. Ayrıca son örnekte yazım kolaylığı çok daha fazla belli oldu. İkinci sorguda self-join yapıldı ve analitik sql’e göre zor ve kompleks bir sorgu yazıldı. İlk sorguda farklı olarak window sort yapıldığını gördük Örneklerden de çıkaracağımız gibi analitik fonksiyonlar bize kullanımı kolay<span>  </span>ve performası yükselten olanaklar sunuyor. O zaman bizede ihtiyaca göre kullanmak düşüyor.</span></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></strong></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">FUNCTİON_NAME(argument,argument)</span></em></p>
<p class="MsoNormal"><em><span style="font-size:10pt;font-family:Verdana;color:blue;">OVER (&lt;Partition-Clause&lt;Order-by-Clause&gt;&lt;Windowing Clause&gt;)</span></em></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:red;"> </span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"><span>       </span>Performansın yanısıra yukarda da kullanımı görüldüğü gibi Analitik fonksiyonun developer tarafından yazması ve anlaşılması çok kolay. Over() ifadesi gördüğümüzde analitik sql var diyoruz .Yaklaşık 26 tane olan fonksiyonları ihtiyacınız doğrultusunda kullanabilirsiniz.</span></p>
<p class="MsoNormal"><span style="font-size:10pt;font-family:Verdana;color:black;"> </span></p>
<p><img src="slm.jpg" alt="go"></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/baranipek.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/baranipek.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/baranipek.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/baranipek.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/baranipek.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/baranipek.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/baranipek.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/baranipek.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/baranipek.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/baranipek.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/baranipek.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/baranipek.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=baranipek.wordpress.com&blog=1363712&post=4&subd=baranipek&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://baranipek.wordpress.com/2007/08/10/analytic-functions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1af5de744b33deae9c31d66c58af9409?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">baranipek</media:title>
		</media:content>

		<media:content url="slm.jpg" medium="image">
			<media:title type="html">go</media:title>
		</media:content>
	</item>
	</channel>
</rss>