31 Temmuz 2007

Union All Kayıt Setinden Gruplamak

Union All ile oluşan kayıt setini bir tablo olarak düşünüp bunun üzerinde gruplama işlemi yapabiliriz. Çeşitli zorunluluklardan veya kötü tasarımdan dolayı raporlama esnasında çeşitli yöntemler bulmak zorunda kalabiliriz.
Örneğin bir satış sitesi olsun ve aynı ürüne ait satış bilgileri farklı 3 tabloda tutulsun. Biz bu 3 tablodan ürün koduyla sorgulama yapıp toplamlarını çekelim. Son olarak da hepsinin toplamını almamız istensin.

select UrunKod,Sum(Fiyat) from
(
select UrunCode,Sum (UrunFiyat) as Fiyat
from table1
where UrunCode=x

union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table2
Where UrunCode=x

union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table3
Where UrunCode=x
)
group by UrunKod

Bu şekilde tek sorguyla istediğimiz sonucu elde edebiliriz. Hem kod içerisinde ekstra koda ihtiyacımız kalmaz hem de bir miktar performans sağlamış oluruz.

25 Temmuz 2007

Haftanın Gününü Veren Fonksiyon

Sql Server'da verilen tarihin haftanın hangi günü olduğunu döndüren kullanıcı tanımlı bir fonksiyon yazalım. DATEPART(weekday,date) şeklinde dönen değer haftanın gün sırasıdır. Fakat bu değer haftanın ilk günü olarak tanımlanan DATEFIRST server değişkenine göre değişmektedir. Bu yüzden fonksiyonda bu durum için bir önlem alacağız.
Amerikan ingilizcesi dil ayarlarında default değer 7 yani Pazar'dır.

SELECT @@DATEFIRST ile tanımlı değeri alabiliriz
SET DATEFIRST 1 (İlk günü Pazartesi olarak tanımlayabiliriz)

CREATE FUNCTION DayOfWeek(@date DATETIME)
RETURNS VARCHAR(9)
AS
BEGIN
DECLARE @defDayofWeek VARCHAR(10)
DECLARE @dofWeek int
SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
SELECT @defDayofWeek=CASE @dofWeek
WHEN 0 THEN 'Pazar'
WHEN 1 THEN 'Pazartesi'
WHEN 2 THEN 'Salı'
WHEN 3 THEN 'Çarşamba'
WHEN 4 THEN 'Perşembe'
WHEN 5 THEN 'Cuma'
WHEN 6 THEN 'Cumartesi'
END
RETURN (@defDayofWeek)
END


SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
ifadesinde ilk günün her zaman Pazartesi olmasını sağladık.

24 Temmuz 2007

Union All Kullanarak Toplu Insert

UNION komutu kullanarak aynı tipteki değerleri tek transactionda ekleyebiliriz. Örneğin bir kayıt formumuz olsun ve bu formda kişinin okuduğu gazeteleri checkbox tipinde bir kontrolle alalım. Normalizasyonu düşünerek bu değerleri farklı bir tabloda UserId ve GazeteId olarak tutalım. Standart yöntemle bir döngü içerisinde her seçili olan kayıt için bir insert komutu çalıştırılır. Fakat bu döngü içinde seçili olanları UNION ALL ile birleştirip tek sorguda kaydı yapabiliriz.

Sorgumuz aşağıdaki şekilde oluşur;



Kayıt sayısının çok fazla olduğu durumlarda işlem süresindeki kazancımız ciddi oranda artacaktır.

21 Temmuz 2007

Silverlight Flash'a Karşı

Oyun bağımlılığım hiç olmadı. En son ortaokul yıllarında tetris rüzgarından nasibimi almıştım. Silverlight örneklerine bakarken bu eski dost bir hayli hoş geldi bana.

Tetris örneğini oynamak için öncelikle Silverlight 1.1 Alpha eklentisini kurmanız gerekecektir.

Microsoft'un zengin interaktif uygulamalar için tarayıcı eklentisi olarak Adobe Flash'a alternatif olarak çıkardığı Silverlight üzerinde bir çok örnek uygulama yapılmaya başlandı. Şu an % 98 oranında yaygınlığa sahip flash a rakip olması ilk bakışta biraz zor görünüyor. Fakat Microsoft'un uyguladığı çapraz ürün bağımlılığı stratejisi onun en büyük avantajı. Örneğin bir .net uygulama geliştiricisi hakim olduğu platformda interaktif uygulama geliştirmeyi flash öğrenmeye/kullanmaya tercih edecektir.

Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz

Bekleyelim ve görelim.

19 Temmuz 2007

Sql Server'dan Oracle'a Geçiş

Yazılım projelerinde veritabanı olarak Oracle ve Sql Server hatırı sayılır bir büyüklüğe sahiptir. Bu nedenle bir çoğumuz iki veritabanıyla da uğraşmak durumunda kalabiliriz. Sql Server'da iyi derecede olup Oracle'a geçişi kolaylaştırmak için başlangıç düzeyindeki farkları yazmanın faydalı olacağını düşündüm. Verdiğim tüm örneklerde Sql Server ifadelerini büyük harflerle Oracle ifadelerini küçük harflerle yazacağım.

Öncelikle çok kullanılan bir kaç fonksiyona bakalım;
GETDATE() - sysdate
ISNULL - nvl
CONVERT(VARCHAR,x) - to_char(x)
CONVERT(DATETIME,x) - to_date(x)
LEN - length
+ -

SELECT * INTO NEW_TABLE FROM TABLE şeklindeki SELECT INTO kalıbı yerine Oracle'da create table new_table as select * from table ifadesini kullanabiliriz.

İki tarih arasındaki fark için kullandığımız DATE_DIFF in direk karşılığı Oracle'da yok. date_diff_month(date1,date2) fonksiyonuyla ay farkını alabiliriz. Ayrıca date2-date1 ifadesi direk olarak gün cinsinden sonuç vereceği için gün farkı için bunu kullanabiliriz.

Değişken tanımlamada
DECLARE @a
INTEGER SET
@a=3
şeklindeki ifade Oracle'da
declare a number;begin a := 3;end;

Sql Server'da bir objeden bağımsız olarak SELECT 1 şeklinde bir sorgulama yapabiliriz. Oracle'da ise dummy table olarak adlandırılan DUAL tablosundan sorgulama yapmamız gerekecektir.
select 1 from dual

17 Temmuz 2007

Kurumsal Veri Yönetimi

İşletmelerin hemen hemen hepsinde kritik öneme sahip Kurumsal Veri Yönetimi konusuyla ilgili kritik sayılabilecek maddeleri aşağıdaki şekilde sıralayabiliriz;



Data Yönetiminin Planlanması

  • Data gizliliğinin sağlanması
  • Data giriş işlemlerinde doğrulama yapılması
  • Data arşivlemesinin düzenli olarak yapılması
  • Bilgi güvenliğinin sağlanması

IT altyapısının basitleştirilmesi

  • Sürekli data büyümesinin kontrolü ve yönetiminin yapılması.
  • Sürekli depolama stratejilerinin belirlenmesi
  • Uygulama içerisinde data temizliği ve tekilleştirme işlemlerinin yapılması
  • Uygulamanın optimize edilmesi

İş Devamlılığının Sağlanması

  • Yükseltim ve aktarımlarda riskin minimuma indirilmesi
  • Hızlı yedekleme ve hızlı geri dönüş
  • Uygulama ulaşılabilirliğinin arttırılması

Kurumsal Değerlere Odaklanmak

  • Uygulamanın iş ihtiyaçlarına göre verimliliğinin arttırılması
  • İş zekası ve içerik Yönetimi nin entegre edilmesi
  • Doğru data yönetim çözümlerinin kullanılması
  • Performans optimizasyonu yapılması ve maliyetlerin kontrol edilmesi

11 Temmuz 2007

Veritabanı ve Pazarlama

Amazon ve eBay etkin veritabanı kullanarak nasıl birer deve dönüşmüştür? Aslında Amazon basit anlamda müşterilerinin satış bilgilerini kullanarak yeni satışlar için çeşitli yönelimler sunmuştur. Peki CRM yaklaşımında kullanılan müşteri veritabanı nasıl oluşur?
Ana sınıflandırma olarak hayatın doğal akışıyla oluşan veriler ve özel olarak alınan veriler olarak iki tip veriden bahsedebiliriz. Örneğin Turkcell için benim yaptığım tüm aramaların numaraları, konuşma süreleri,tercih ettiğim saatler, mesaj çekme yoğunluğum, hangi şebekeleri kullandığım doğal akışımda oluşan bilgilerdir. Hat almak için doldurduğum sözleşmedeki bilgilerse 2. kategoridedir. Aynı şekilde marketten aldığım ürünler de doğal akışla oluşan veriler. Başka bir gruplamayı da kişilerin özlük bilgileri, tercihleri ve aktiviteleri olarak tanımlayabiliriz. Bu gruplamada bazı durumlarda aktivite tercihler hakkında bilgi sahibi verebilir.
Veritabanı kullanım şeklini de 3 seviyede ele alabiliriz. Birincisi klasik anlamda bazı işlemleri yapabilmek için veri depolamak anlamında kullanılan veritabanı. Örneğin giriş yapan kullanıcının şifre kontrolü için şifre bilgisini kaydetmek.İkincisi raporlama ve analiz amaçlı bazı verileri depolamak.Üçüncüsü ve en önemlisi ise bu verilerin işlenerek stratejik kararlarda destek niteliğinde kullanılması.
Bu durumlar için en güzel örnek Google Analytics aracı olacaktır. Bir kaç yıl öncesine kadar sitelere konulan sayaçlar belki de sitenin istatistik ihtiyacını gideriyordu, fakat günümüzde tarih, saat, lokasyon, sitede kalma süresi, internete bağlandığı ağ, tarayıcı tipi, javascript desteğinin olup olmadığı, arama motorlarından geldiyse hangi kelimelerle arandığı gibi çok sayıda veri alınıyor.
Peki bu yöntemle elimizde çok değerli! bilgiler oluştu. Bu bilgileri saklayabilmek için veri depolama maliyetlerimiz arttı. Veri çoğaldığı için yorumlamak daha da zorlaştı. Kritik olan nokta bu verilerin ne kadarını kullandık. Attığımız taş ürküttüğümüz kurbağaya değdi mi?

Bir kaç önemli kuralı sıralayacak olursak;
* Esnek bir veritabanı tasarımı yapılıp bu tasarıma göre veri alınmalıdır.
* Her veri önemli değildir. Bilgiye dönüşmeyen verinin bir faydası yoktur.
* Veri alındığı anda değerlidir. Bir süre sonra veri önemini kaybeder.
* İnsanlar bilgi vermekten hoşlanmıyor veya isteksiz veriyor.

Çehov'un "Duvarda asili silah oyunun sonunda mutlaka patlar" kuralına gönderme yaparak "veri alındıysa mutlaka değerlendirilmelidir" dersek çok katı olmayız sanırım :)

04 Temmuz 2007

Oracle'da Kill Process İşlemi

Veritabanlarının doğal süreçleri olarak kabul edilen deadlock lar Oracle üzerinde oluştuğunda aşağıdaki nacizane hatayı alırız.

ORA-00054 resource busy and acquire with NO WAIT specified

Bu durumda hata oluşan prosesi kill etmek yoluyla kaynağı boşaltabiliriz.Öncelikle aşağıdaki sorguyla lock oluşan işlemleri listeleyelim.

SELECT o.object_id,s.sid,s.serial#,o.object_type,o.object_name,
l.oracle_username,os_user_name,locked_mode,s.program
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id = o.object_id AND l.session_id=s.sid

Daha sonra da istediğimiz sessionları aşağıdaki sorguyla bitirebiliriz.

ALTER SYSTEM KILL SESSION 'sid,serial'