Mart 22, 2010

“Kur’an’la amel eden dünyaya hakim olur.”
MAHMUD USTAOSMANOĞLU EFENDİ

Reklamlar

Oracle Function-Based Index

Mayıs 23, 2018

İlişkisel Veritabanı Yönetim Sistemleri (RDBMS) ‘nde veriler tablolarda tutulmaktadır ve tablolar arasında da Primary Key – Foreign Key kullanılarak ilişkiler tasarlanmaktadır. Kullanıcılar veritabanındaki tablolarda bulunan ilgilendikleri verileri SQL sorgularıvasıtasıyla çekmektedirler. Yazılan SQL sorgusuna bağlı olarak, kullanılan veritabanı yönetim sistemi optimizerı, veriye bütün tabloyu baştan sona tarayarak (table scan / full access) veya ilgili kolonlar üzerinde veriye erişimi hızlandırmak için oluşturulan index sayfalarını okuyarak (index seek / index scan) erişebilmektedir. Çoğu durumda index sayfalarının okunmasıyla veriye erişim çok daha hızlı gerçekleştirilmektedir. Bu sebeple veritabanı geliştiricileri veya veritabanı yöneticileri optimize etmek istedikleri sorguları inceleyerek belirli kolonlara indexler oluşturarak sorgu sürelerini azaltmayı hedeflemektedirler.

İndex oluşturulan kolonlar SQL sorgusunun WHERE kısmında yalın haliyle kullanıldığında (herhangi bir function veya expression içerisinde kullanılmadığında), ilgili sistemin optimizerı oluşturulan indexin sayfalarından okuma yaparak veriye hızlıca erişebilir. Ancak index oluşturulan kolonlar WHERE koşulu içerisinde yalın haliyle kullanılmayıp, örneğin bir fonksiyon içerisinde kullanıldıysa, ilgili optimizer veriye erişebilmek için var olan indexi kullanamaz hale gelir.

Genellikle veritabanı geliştiricilerinin başına gelen ve “Neden oluşturmuş olduğum index optimizer tarafından kullanılmıyor?” sorusunun muhtemel yanıtlarından birisi yukarıda bahsedilen durumdur. Oracle, böyle bir durumla karşılaştığınızda sizlere index oluşturulmak istenilen kolonu yalın haliyle indexleme imkanının yanında bir de kullanılan fonksiyon ile beraber ayrıca index oluşturma imkanını da sunmaktadır. Bu şekilde oluşturulan index türüne Oracle’da Function-Based İndex adı verilmektedir. Function-Based İndex‘ler vasıtasıyla tablolara ait kolonlar Oracle fonksiyonları ile beraber indexlenebilmektedir. Genel olarak anlattığımız konuyu bir de örnekle inceleyelim:

Aşağıda Oracle SQL Developer aracı kullanılarak bir SQL sorgusu çalıştırılmaktadır:

SELECT * FROM grade, student, instructor, zipcode

WHERE UPPER(grade_type_code) = ‘PJ’;

Yukarıdaki SQL sorgusunda course, instructor, zipcode ve grade tabloları cross joinolacak şekilde bağlanmış ve sorgunun WHERE filtresi kısmında grade_type_code değeri‘PJ’ olan kayıtlar getirilmek istenmiştir. Ancak ilgili tabloda tutulan değerlerin küçük/büyük harflerle birlikte tutulabileceği göz önüne alınarak grade_type_code kolonu UPPERfonksiyonu ile beraber kullanılarak her çeşit tutulabilen değerlerin getirilmesi garanti altına alınmıştır.

Bu şekilde oluşturulan bir sorgu için sadece grade_type_code kolonu üzerineDENEME_1 isminde bir index oluşturalım:

CREATE INDEX DENEME_1 ON GRADE (GRADE_TYPE_CODE);

Ardından sorgumuzun explain planını inceleyerek Oracle optimizerının DENEME_1ismindeki indexi kullanıp kullanmadığına bakalım:
0

Explain Plan çıktısından görülebileceği gibi Oracle optimizerı grade tablosunaDENEME_1 index sayfalarını okuyarak değil, FULL TABLE ACCESS yöntemini kullanarak bütün tabloyu baştan sona okumayı tercih etmiş gözüküyor. grade_type_codekolonunda index oluşturulmasına rağmen bu yöntemi seçmesi ve indexi kullanamamasının sebebi, grade_type_code kolonunun UPPER fonksiyonu içerisinde kullanılmış olmasıdır.

Bu durumda Oracle Function-Based İndex oluşturularak bu sorunun üstesinden gelinmesi sağlanabilir. Aynı sorguyu bir de aşağıdaki DENEME_2 isminde bir Function-Based Index oluşturarak çalıştıralım ve explain planını inceleyelim:

CREATE INDEX DENEME_2 ON GRADE (UPPER(GRADE_TYPE_CODE));

Şu an grade tablosundaki grade_type_code kolonu üzerinde hem DENEME_1 isminde bir normal index bulunmakta, hem de DENEME_2 isminde bir function based indexbulunmaktadır. Sorgunun tekrar çalıştırılmış ve explain planının oluşturulmuş hali aşağıdaki gibi olacaktır:

0 (1)

Görüldüğü gibi Oracle SQL optimizerı DENEME_2 ismindeki function-based indexikullanarak veriye erişmiş durumdadır. Aşağıda her iki durumda oluşturulan explain planların karşılaştırılması verilmiştir:

0 (2)

Oracle veritabanlarında kullanılan sorgular için funciton-based index oluşturulması görüldüğü gibi oldukça basit bir işlemden ibarettir. Normal bir index oluşturur gibi indexe bir isim verilmekte, hangi tablonun hangi kolonu üzerinde index oluşturulacağı belirtilmekte, farklı olarak sadece bu kolonu ilgili fonksiyon ismi ile beraber indexleneceği bilgisi verilmektedir. İşinize yaraması dileklerimle bir sonraki yazımızda görüşmek üzere…

Yazının orjinal haline aşağıdaki link üzerenden erişebilirsiniz;

http://www.abdullahaltintas.com/index.php/neden-oracle-olusturulan-indexi-kullanmiyor-oracle-function-based-index-olusturma/

Hangi portu hangi program kullanıyor.

Şubat 13, 2017

netstat -o -n -a | findstr 0.0:8080 verilen PID no görev yöneticisinden hangi uygulamanın kullandığını göre biliriz

(function (d, w, c) {
(w[c] = w[c] || []).push(function() {
try {
w.yaCounter47599039 = new Ya.Metrika({
id:47599039,
clickmap:true,
trackLinks:true,
accurateTrackBounce:true
});
} catch(e) { }
});

var n = d.getElementsByTagName(“script”)[0],
s = d.createElement(“script”),
f = function () { n.parentNode.insertBefore(s, n); };
s.type = “text/javascript”;
s.async = true;
s.src = “https://mc.yandex.ru/metrika/watch.js”;

if (w.opera == “[object Opera]”) {
d.addEventListener(“DOMContentLoaded”, f, false);
} else { f(); }
})(document, window, “yandex_metrika_callbacks”);

Hot to get the current date in T-SQL

Şubat 13, 2017

SELECT SYSDATETIME() as SYSDATETIME,
SYSDATETIMEOFFSET() as SYSDATETIMEOFFSET,
SYSUTCDATETIME() as SYSUTCDATETIME,
CURRENT_TIMESTAMP as “CURRENT_TIMESTAMP”,
GETDATE() as GETDATE,
GETUTCDATE() as GETUTCDATE,
CAST(GETDATE() As date ) CAST,
CONVERT (date, GETDATE()) as “CONVERT”;

 

SYSDATETIME 2017-02-13 17:16:16.0697359
SYSDATETIMEOFFSET 2017-02-13 17:16:16.0697359 +03:00
SYSUTCDATETIME 2017-02-13 14:16:16.0697359
CURRENT_TIMESTAMP 2017-02-13 17:16:16.067
GETDATE 2017-02-13 17:16:16.067
GETUTCDATE 2017-02-13 14:16:16.067
CAST 2017-02-13
CONVERT 2017-02-13

Ubuntu upgrade operation

Eylül 1, 2016

I tried this version: 15.10 to 16.04

cat /etc/apt/sources.list

1- sudo sed -i -e “s/wily/xenial/g” /etc/apt/sources.list

cat /etc/apt/sources.list

2- sudo apt-get update
3- sudo apt-get dist-upgrade

lsb_release -a

SQL Developer Setup Configuration

Kasım 30, 2015

…/sqldeveloper/sqldeveloper/bin/sqldeveloper.conf

SetJavaHome ../../jdk

terminalde Jdk yı indirdiğiniz klasörün içerisine gelerek (teyit etmek için bulunduğunun klasörün icinde bin klasörü var ise doğru yerdesiniz) pwd komutunu yazıp enter a basarsanız o klasörün path ini vercecektir.

LISTAGG YAN YANA

Kasım 19, 2015

SELECT PERSONEL_ID, LTRIM(LISTAGG(PERIOD, ‘,’) WITHIN GROUP (ORDER BY PERIOD),’,’) PERIODS
FROM PERSONEL_INF0
WHERE PERSONEL_ID =317
AND CREATED_TIMESTAMP >= sysdate-100
GROUP BY PERSONEL_ID
ORDER BY PERSONEL_ID;

PERSONEL_ID PERIODS
——– —-
1 David
1 John
1 Alan
1 David
2 Julie
2 Charles
And I want the following result:

PERSONEL_ID PERIODS
——– —–
1 ‘Alan, David, John’
2 ‘Charles, Julie’

======================= ** 2 ** =========================

with my_tabe as
(
select ‘M01’ as scycle, ‘1’ as sdate from dual union
select ‘M01’ as scycle, ‘2’ as sdate from dual union
select ‘M02’ as scycle, ‘1’ as sdate from dual
)
select scycle, ltrim(sys_connect_by_path(sdate, ‘,’), ‘,’)
from
(
select distinct sdate,
scycle,
count(1) over (partition by scycle) as cnt,
row_number() over (partition by scycle order by sdate) as rn
from my_tabe
)
where rn = cnt
start with rn = 1
connect by prior rn + 1 = rn
and prior scycle = scycle

 

How to install Eclipse Resource Bundle Editor

Ekim 22, 2015

Update Site:

Create a new update site in Eclipse with the following:

Site name: ResourceBundle Editor
Site URL: https://raw.githubusercontent.com/essiembre/eclipse-rbe/master/eclipse-rbe-update-site/site.xml

Whitelabel Error Page

Haziran 24, 2015

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Jun 24 16:48:24 EEST 2015
There was an unexpected error (type=Not Found, status=404).
No message available

How to read Query Parameters key and value

Haziran 11, 2015

How to read Query Parameters key and value

javax.persistence.Query

Query query = ….
query.setParameter(“PARAM_1″,”1”)
.setParameter(“PARAM_2″,”2”)
.setParameter(“PARAM_3″,”3″)

…;
I want to get parameters and write Console. Like this;

System out ;

PARAM_1 – 1
PARAM_2 – 2
PARAM_3 – 3

ANSWER ;
java.util.Set<Parameter> params = query.getParameters();
for (Parameter p : params) {
String paramName = p.getName();
System.out.print(paramName + ” – “);
System.out.println(query.getParameterValue(paramName));
}

Target : http://stackoverflow.com/questions/28046207/how-to-read-query-parameters-key-and-value

Yonca Bilişim Teknolojilerine Yazılım Geliştirme Uzmanı Aranıyor !!!

Haziran 9, 2015

Yonca Bilişim Teknolojilerine Yazılım Geliştirme Uzmanı Aranıyor !!!

İlana aşağıdaki linkten ulaşabilirsiniz.

Yazılım Geliştirme Uzmanı Aranıyor
http://www.kariyer.net/yonca-bilisim-teknolojileri/yazilim-gelistirme-uzmani-is-ilani-i1384295/?&tmpsno=1&isaramalog=337894012&sirano=1&isaratipi=2