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'

30 Mayıs 2007

Son Çalışan Sorguların Listesi

Daha önce Profiler aracını kullanarak izleyebildiğimiz çalışan sorgu listesine Sql Server 2005'le birlikte sys.dm_exec_query_stats isimli view sayesinde ulaşabiliriz. Bu özelliğin bazı projelerde işleri kolaylaştıracağını düşünüyorum. İhtiyaç halinde kullanmak üzere view i kullanan basit bir sp yazalım.
Sorgunun metnini, son çalışma zamanını,sorgu çalıştırma planını ve sorgunun çalışma sayısı bilgilerini döndürsün.

CREATE PROCEDURE [dbo].[sp_qryStats]

as
SELECT

SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset)/2) + 1) as statement_text,
convert(varchar,last_execution_time) as last_execution_time,
qp.query_plan,
execution_count
FROM sys.dm_exec_query_stats as qs
--sql_handle değeri text hale getirilir
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st
--plan_handle değeri xml tipte veri döndürecek hale getirilir
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as qp
--Aslında bu çalıştıracağımız sorgu da listelenen sorgular arasında olduğu için bir where koşulu ekledik
Where st.text not like '%sys.dm_exec_query_stats%'
ORDER BY last_execution_time DESC

exec [dbo].[sp_qryStats]
Prosedür sonucunda alacağımız çıktı aşağıdaki şekilde olacaktır.


29 Mayıs 2007

SSIS Kullanarak Veri Tekilleştirmesi

Sql Server 2005 ile gelen Business Intelligence araçlarından Integration Services projesi hazırlayarak çok basit bir uygulama yapacağız. Özet olarak 6 satırlık bir tabloda verdiğimiz kurallara göre tekilleştirme yapıp tekil ve tekil olmayan kayıtları farklı tablolara ekleyeceğiz.

--Örnek tablomuzu yaratalım,
CREATE TABLE [dbo].[user](
[userid] [int] IDENTITY(1,1) NOT NULL,
[ad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[soyad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[email] [varchar](100) COLLATE Turkish_CI_AS NULL,
[gsm] [varchar](20) COLLATE Turkish_CI_AS NULL,
[insertDate] [smalldatetime] NOT NULL CONSTRAINT [DF_user_insertDate] DEFAULT (getdate())
) ON [PRIMARY]

--Test kayıtlarımızı ekleyelim,
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Zinedine','Zidane','zinedine@zinedine.com','5321234567')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Eto','samuel@eto.com','5329876543')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Erik','Cantona','eric@cantona.com','5321111111')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('ZINEDIN','ZIDAN','zinedine@zidan.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Etho','samuel.eto@eto.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Eric','Cantona','eric@cantona.com','5321111111')

Visual Studio 2005 kullanarak Business Intelligence Projects tipi projelerden bir Integration Services Project yaratalım. Data Flow sekmesindeki linke tıklayarak yeni bir Data Flow yaratalım. Data Flow Sources panelinden bir tane OLE DB Source kontrolü ekleyelim. Gerekli bağlantı ayarlarını yapıp, "Table or View" seçeneğini aktif bırakıp "user" tablomuzu seçelim. Bu şekilde kaynak datamız hazırlanmış oldu. Data Flow Transformations panelinden Fuzzy Grouping kontrolünü Data Flow'a ekleyelim. Bu kontrolü kaynak kontolden çıkan yeşil okla birleştirelim. Fuzzy Grouping kontrolünün Columns sekmesine tıklayarak, tekilleştirme yapmak istediğimiz kritik alanları ve benzeşim katsayılarını seçmemiz gerekecektir.Örnek olarak ad ve soyad alanlarının solundaki chkbox ları seçip, Minimum Similarity değerlerini 0,7 yapalım. Bunun anlamı ad ve soyad değerleri %70 oranında benzeyen satırlar aynı kabul edilecektir. Data Flow Transformations panelinden Conditional Split kontrolünü önceki kontrolün yeşil okuna ekleyelim. Bu kontrolde kritik olan _key_in ve _key_out kolonlarıdır.
_key_in : Satırın tablodaki sıra değeridir.
_key_out: Satırın verdiğimiz kriterlere göre benzeşim sıra değeridir
.
Burada 2 durum sözkonusu olsun. Tekil ve diğer kayıtları ayırmak isteyelim.
Case 1 : _key_in == _key_out
Case 2 : _key_in != _key_out
şeklinde 2 durum yaratalım.

Son olarak bu iki durumdan çıkan kayıtları farklı tablolara atmamız gerekecek.Bunun için de Data Flow Destinations panelinden 2 tane OLE DB Destination kontrolü ekleyelim. Bir önceki kontrolün yeşil okunu hedef kontrole bağlamaya çalıştığımızda bize hangi durumun çıktısını alacağımızı sorar. Projeyi çalıştırdığımızda örnek 6 kaydın 3 er kayıt olarak 2 tabloya eklendiğini görebilirsiniz. Veri kolonlarına ek olarak benzerlik oranlarının da ek kolonlar olarak eklendiğini göreceksiniz.

Sonuçta aşağıdaki şekilde bir Sql Server Integration Service paketimiz oluşacaktır,


Yazıyı fazla uzatmamak için detaylara çok fazla inmedim. Bu projeyi aşağıdaki linkten indirirek detayları inceleyebilirsiniz.

http://www.harunpeksen.net/CodeSample/SSISTest1.rar

Not: Projeyi kendi sisteminizde çalıştırmak için Sql Server bağlantı değerlerini güncellemeniz gerekecektir.

08 Nisan 2007

Sql Server'da Case Fonksiyonu

SQL SERVER'da CASE fonksiyonuna bir örnek verelim. Web sitemİzdeki üyeler siteye giriş yaptıktan sonra bir karşılama mesajımız olsun ve bu mesaj da üyenin Cinsiyet,Yaş ve Medeni Durum bilgilerine göre oluşsun.

25 yaşından büyük veya evli bayanları; Hoşgeldiniz Ebru Hanım,
25 yaşından büyük veya evli erkekleri; Hoşgeldiniz Emre Bey,
18-25 yaş arası ve evli olmayan kişileri; Merhaba Ahmet/Ayşe,
18 yaşından küçükleri de; Sevgili Ebru/Emre,

olarak karşılamak isteyelim.

Önce üye tablomuzu yaratalım

CREATE TABLE [dbo].[Uye](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](50) NOT NULL,
[Soyad] [varchar](50) NOT NULL,
[Yas] [smallint] NOT NULL,
[Cinsiyet] [char](1) NOT NULL,
[MedeniHal] [char](1) NOT NULL,
CONSTRAINT [PK_Uye] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
)

Sonra örnek kayıtlarımız girelim

INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Ebru','Kaya',29,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Emre','Aslan',29,'E','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Aslı','Doğan',23,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Selim','Kutlu',17,'E','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Sibel','Ayaz',24,'K','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Nilay','Kalaycı',14,'K','B')



Daha sonra sql cümlemizi aşağıdaki şekilde oluşturalım.

SELECT [UserId],[Message] = CASE
WHEN Cinsiyet='K' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Hanım'
WHEN Cinsiyet='E' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Bey'
WHEN Yas>18 THEN 'Merhaba ' + [Ad]
ELSE 'Sevgili ' + [Ad]
END
FROM Uye

Sorgu sonucumuz aşağıdaki şekilde olacaktır.



17 Mart 2007

Normalizasyon

Veritabanı tasarımı konusunda en önemli kavramlardan biri olan Normalizasyon ile ilgili teorik çok fazla şey yazılabilir. Ben bu kavramı kafasında net olarak oturtamayanlar için küçük bir örnek vermek istedim. Tasarlayacağımız veritabanı çok uluslu kaynaklarla proje üreten bir firmanın yaptığı proje ve çalışan bilgilerini tutsun. Projelerimizi "Amerika'nın yeniden keşfi" ve "Lambaya püf denilmesi" olarak belirleyelim.

Proje bilgileri tablomuzu oluşturup gerekli kayıtları ekleyelim.



Normalize etmek için öncelikle tekrarlanan sütunları bulalım. Bu datayı normalize ettiğimiz zaman 5 tablomuz olacaktır. Bunlar.

Proje (ProjeId,ProjeAd)
Calisan(CalisanId,CalisanAd,CalisanMaliyet,CalisanUlke)
Maliyet(MaliyetId,MaliyetTutar)
Ulke(UlkeId,UlkeAd)
ProjeBilgileriN(ProjeId,CalisanId,CalismaGunu)



Normalize ettiğimiz tablolara aynı verileri girelim.



Bu tasarımda önemli bir kaç normalizasyon kuralını kullandık. Aşağıdaki linkte 5 normalizasyon kuralı bir afiş olarak yer alıyor. İlginç.
http://www.marcrettig.com/poster/rettigNormalizationPoster.pdf

07 Mart 2007

Sql Server Best Practices Analyzer Aracı

Bir kaç gün önce Microsoft Sql Server Best Practices Analyzer adlı bir araca rastladım. İstediğiniz Sql Server instance ı üzerinde seçtiğiniz database leri analiz edip size çeşitli önerilerde bulunuyor. Ben örnek olarak Service Pack 3 yüklü 2000 instance ı üzerindeki Northwind database ini analiz ettim. Aşağıdaki şekilde bir rapor oluştu.



Daha açık olarak;

* SQLBrowser servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Bulk Insert işleminde bazı problemler yaşanabilir, 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Automatic checkpoint özelliğini kullanabilmek için 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Şu an Mixed modda çalıştığımı, güvenlik sebebiyle "Windows Authentication" modda kullanmayı önermiş
* Çok sayıda kullanıcının SysAdmin rolünde bulunduğunu, 2'den fazla olmaması gerektiğini belirtmmiş
* Service Pack 4 'e geçmeyi ayrıca önermiş
* SQLAgent servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Memory Scribbler probleminin Service Pack 4 öncesinde yaşanabileceğini belirtmiş
* Strong bir şifre kullanmam gerektiğini söylemiş
* Northwind'in hiç backup ının alınmadığını belirtmiş
* Northwind üzerinde Guest accountunun yetkisi olduğunu belirtmiş, önermemiş

Özetle "Service Pack 4 yükle rahat et" mesajını aldım:)

Belki karmaşık database lerde daha yönlendirici sonuçlar çıkacaktır, denemek lazım.

Aşağıdaki linkten download edebilirsiniz:
http://www.microsoft.com/downloads/details.aspx?FamilyId=B352EB1F-D3CA-44EE-893E-9E07339C1F22&displaylang=en

01 Mart 2007

Business Intelligence


Son yıllarda "Business Intelligence" kavramını sıkça duymaya başladık. Bu kavram ilk olarak 1989 yılında Gartner Inc. firmasında analist olarak araştırma yapan Howard Dresner tarafından kullanılmıştır. O tarihe kadar DSS (decision support system) ve EIS (executive information system) gibi karışıklık yaratan kavramlar kulanılmaktaydı. Kelime olarak iş zekası şeklinde tanımlanan ama aslında bence şu an için zekadan bahsedemeyeceğimiz bir kavram. Merkezinde veri madenciliği var aslında. Klasik veri madenciliğinde temel olan konu verileri çeşitli yöntemlerle analiz ederek bilgiye dönüştürmektir. Business Intelligence kavramını veri analizinin yanında ETL (Extract, Transform, Load) işlemlerini ve Raporlama ihtiyaçlarını daha geniş bir açıdan bakarak sağlayan çözümler olarak düşünebiliriz. Business Intelligence uygulamaları sayesinde karar vericiler,stratejik ve operasyonel kararlarında daha doğru ve hızlı adımlar atabilmektedirler. Burada zekadan çok aslında bir yönlendirme söz konusu. Bu nedenle karar destek sistemleri tanımı bana biraz daha doğru geliyor.

Dünyadaki BI çözümlerine baktığımızda;

3 database devi:
IBM DB2 Business Intelligence
Oracle Business Intelligence Solutions
Microsoft SQL Server: Business Intelligence Solutions


Database ürünü olmayan yazılım devleri:
SAP Business Intelligence
Business objects
SAS - Business Intelligence Software Solutions
Microstrategy
Cognos
Hyperion


Business Intelligence ın geleceği konusunda Gartner için araştırma yapan Andreas Bitterer ın tespitleri ise şu yönde;

* BI bir çok kurumdaki deneyimli IT Manager'ın kafasında ilk planda yer alıyor
* BI'ın bir proje olmayıp devamlı bir süreç olarak düşünülmesi gerekir.
* Sık karşılaşılan bir durum da data kirliliği. Fakat "bu gezegende data kirliliği problemini yaşamayan bir firma yok"
* Kurumların data çalışanlarına ihtiyacı var. Bu kişiler kurum içerisinde çok deneyimli kişiler olmayabilir ama datayı nasıl yöneteceğini bilen kişiler olmalı.

SQL Server Business Intelligence Solutions çözümlerini inceleme fırsatım oldu. 3 temel servis bulunmakta. Integration Services, Analysis Services, Reporting Services. .net kullanıcıları 2005 ortamında kendi Business Intelligence projelerini yaratıp data işlemlerinde kod parçacıkları yazabilmekteler. Kısmen incelediğim Sql Server Integration Service projesi içerisinde kullanabileceğimiz hazır 11 bulanık mantık algoritması kullanan fuzzy lookup kontrolleri ETL işlemlerinde bir hayli işe yarar gibi görünüyor.

05 Şubat 2007

Soundex ve Difference Fonksiyonları

Sorgulamalarda text alanlara ait arama işlemlerinde like metodunu sıklıkla kullanırız. Like güzel hoş ama, bilhassa büyük hacimli datalarda veya cleanbase olmasını istediğimiz sistemlerde bazen işimizi görmez. Bu gibi durumlarda çok basit iki string fonksiyonu kullanarak işimizi görebiliriz.Bunlar SOUNDEX ve DIFFERENCE fonksiyonları.

SOUNDEX basit anlamda bizim string ifademizi 4 haneli bir koda dönüştürür.Bu kodun ilk harfi string değerimizin ilk harfi olur. Daha sonraki harflerse aşağıdaki eşleştirme tablosundan o harfe karşılık gelen sayı olur.

  • 1 : B,F,P,V
  • 2 : C,G,J,K,Q,S,X,Z
  • 3 : D,T
  • 4 : L
  • 5 : M,N
  • 6 : R
  • Kod yok : A,E,H,I,O,U,Y,W

Select SOUNDEX('Chris'),SOUNDEX('Chrys') ifadesinden bize dönen değerler;

C620 ve C620 olacaktır.

Where koşulunda aşağıdaki şekilde kullanabiliriz:

SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')
Bu sorgu sonucu benzerlik kodu 'Chris' ile aynı olan isimler döner.
DIFFERENCE fonksiyonu da bize bu 4 haneli kodlardan iki string arasındaki benzerliği vermektedir.
SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')

Bu sorguyla da adı 'Chris' ile % 75 veya daha fazla benzer olan kayıtları sorguladık.