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.