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.

17 Ocak 2007

Aspnet_Profile Tablosundan Alanları Sorgulamak

Membership kontrolleri ASP.net 2.0 la gelen yeniliklerden birisi. Kullanıcı ile ilgili bir çok modül hazır olarak bulunmakta. Varsayılan alanlar haricinde, kullandığımız özel alanlar aspnet_Profile tablosunda tek bir sütunda tutulur ve aspnet_User tablosuyla UserId alanından ilişkilendirilmiştir. Bir asp.net web sayfasında kullanacaksak problem yok, database den direk bu kayıtları görmemiz gerekirse işimiz pek de kolay değil. Bu tarz bir ihtiyaçta aşağıdaki fonksiyon kullanılabilir.

aspnet_Profile.PropertyNames : Profil alanların isim ve pozisyonlarının tutulduğu sütun
aspnet_Profile.PropertyValuesString : Profil değerlerinin tutulduğu sütun


CREATE FUNCTION [dbo].[GetProfileProperty](
@profileName varchar(50),
@PropertyNames varchar(8000),
@PropertyValuesString varchar(8000)
)
RETURNS varchar(500)
AS
BEGIN

DECLARE @MyOutput varchar(1000)
SET @MyOutput=substring (
@PropertyValuesString,
convert(int,(substring(@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3,
(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3)- charindex(@ProfileName,@PropertyNames,1) - len(@ProfileName) - 3))
)) + 1,
convert(int,(substring(@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1,
((charindex(':',@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1))-(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1)
))))
)
RETURN @MyOutput
END



Bu fonksiyonu kullanarak,

SELECT dbo.GetProfileProperty('Firma',PropertyNames,PropertyValuesString)
FROM dbo.aspnet_Profile

cümlesiyle tüm kullanıcıların firma bilgisini alabiliriz.

05 Ocak 2007

Tabloda Email Kontrollü Kolon Yaratmak

Eğer tablonuzda email alanı varsa ve siz her ihtimale karşı son noktada önlem almak istiyorsanız bir kaç adımda bunu halledeblirsiniz. Sql Server 2005 ve CLR kullanarak.

Önce bir C# fonksiyona ihtiyacımız var. RegEx kullanan basit bir fonksiyon.

public class clsEmailValidator
{
public static int ValidatePostaFormat(string email)
{
string regExPattern = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$";
System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex(regExPattern);
if (email.Length != 0 & !regEx.IsMatch(email))
{
return 0;
}
{
return 1;
}

}

}


Daha sonra Sql Server 2005'te bir assembly oluşturalım;

CREATE ASSEMBLY EmailValidator
FROM 'C:\Documents and Settings\harunp\My Documents\Visual Studio 2005\Projects\EmailValidator\EmailValidator\bin\Debug\EmailValidator.dll'

Sonra bu assembly i kullanan bir email validasyon fonksiyonu yaratalım.

CREATE FUNCTION ValidateEmail
(
@email nvarchar(80)
)
RETURNS int
AS EXTERNAL NAME EmailValidator.clsEmailValidator.ValidatePostaFormat


Sonra bu fonksiyonu kullanacağımız bir tablo yaratalım. Tek yapmamız gereken fark email alanını yaratırken bir koşul eklemek.

CREATE TABLE [dbo].[tblUser](
[ad] [nvarchar](80),
[soyad] [nvarchar](80),
[email] [nvarchar](80) CHECK ([dbo].[ValidateEmail]([email])=(1))
)


INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','test@test.com')

(1 row(s) affected)

INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','testtest.com')

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__tblUser__email__412EB0B6". The conflict occurred in database "Test", table "dbo.tblUser", column 'email'.
The statement has been terminated.


Değer email formatında olmadığı için tabloya insert edilemedi. Bu yöntemle geçersiz bir email adresinin veritabanına girişini son noktada kontrol etmiş oluruz.

12 Aralık 2006

Tek Kolonda Tutulan Çoklu Değerler

Veritabanımızda bir verinin değeri birden fazla değerden oluşabiliyorsa (checkbox), bu durumda bu alanları saklamak için 2 yöntem kullanabiliriz. Birincisi bu değerleri bir key ilişkisiyle ayrı bir tabloda satırlar halinde tutmak, ikincisi ayırıcı bir karakter yardımıyla bu değerleri tek bir alanda tutmak. Birinci yöntemde raporlamada problem yaşanmaz, fakat ikinci yöntemde bu değerlerin gösterimi ve analizi biraz daha zor olacaktır.
Böyle bir durumla karşılaşırsak yazacağımız bir Split fonksiyonuyla işimizi kolaylaştırabiliriz.

Alan değerimizin izlenen TV kanalları olduğunu varsayalım. Değerleri de;

1: ATV
2: KANAL D
3: SHOW TV
4: NTV
5: CNN TURK


olsun. Ayırıcı işaret olarak ";" kullandığımızı varsayalım.

--Önce Split fonksiyonunu yazalım;

CREATE FUNCTION [dbo].[Split] (@Str NVARCHAR(500), @Delimiter CHAR(1))
RETURNS @Results TABLE (Rows nvarchar(4000))
AS
BEGIN
DECLARE @Indx INT
DECLARE @Prt NVARCHAR(4000)
SELECT @Indx = 1
IF @Str Is NULL RETURN
WHILE @Indx != 0
BEGIN
SELECT @Indx = CharIndex(@Delimiter, @Str)
IF @Indx != 0
SELECT @Prt = left(@Str, @Indx - 1)
ELSE
SELECT @Prt = @Str
IF (@Prt!='0' and @Prt!='') INSERT INTO @Results(Rows) VALUES (@Prt)
SELECT @Str = right(@Str, Len(@Str) - @Indx)
IF Len(@Str) = 0 BREAK
END
RETURN
END

Daha sonra test için bir kullanıcı tablosu yaratalım,
CREATE TABLE [dbo].[UserInfo](
[userid] [int] NOT NULL,
[Email] [varchar](100) COLLATE Turkish_CI_AS NOT NULL,
[channel] [varchar](100) COLLATE Turkish_CI_AS NOT NULL
)

Sonra bu tabloya test kayıtları ekleyelim

INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (887,'test1@test.com','1;0;0;4;5')
INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (965,'test2@test.com','1;0;3;0;0')

Daha sonra kanal seçim tablosunu oluşturalım
CREATE TABLE [dbo].[Channels](
[userid] [int] NOT NULL,
[Channel] [int] NOT NULL
)

Yazdığımız Split fonksiyonunu kullanarak kayıtları ekleyelim
DECLARE @channel varchar(200)
DECLARE @userid varchar(200)
DECLARE @cr_channel CURSOR
SET @cr_channel = CURSOR FOR
SELECT channel,userid FROM dbo.UserInfo
OPEN @cr_channel
FETCH NEXT FROM @cr_channel INTO @channel,@userid
WHILE ( @@FETCH_STATUS = 0)
BEGIN
INSERT INTO
Channels(userid, channel)
SELECT @userid, * From Split (@channel,';')
FETCH NEXT FROM @cr_channel INTO @channel,@userid
END

Channels tablosunda userid ve Channel olarak satır bazlı kayıtlarımız oluştu. Bu kayıtları artık çok rahat bir şekilde kullanabiliriz.

07 Aralık 2006

Delete Ve Truncate Komutları Arasındaki Fark

Bazen çözüme ulaşmak için kullanımı aynı gibi görünen farklı yöntemler kullanıyoruz. DELETE ve TRUNCATE ikilisi de bunlardan biri aslında. Peki ikisi arasında ne fark var? Aslında bu farklar bir hayli fazla.

DELETE komutunda işlem sonunda satırlar fiziksel olarak silinir ve satır bazlı olarak loglanır. Bu yüzden yüksek miktarda satıra DELETE işlemi sık periyotta uygulandığında log file zamanla büyük boyutlara ulaşacaktır. TRUNCATE komutu da loglama yapar;fakat farklı bir yolla. TRUNCATE komutu işleme tabi tutulan tablodaki kayıtları bulunduğu pagefile ları işaretler. Aslında TRUNCATE işleminde data silinmeyip daha sonra kullanılmak üzere işaretlenmektedir. Bu da TRUNCATE işleminin DELETE işlemine göre çok daha performanslı çalışmasını sağlar.

DELETE komutu Foreign Key veya diğer Constraint lere zarar vermeden kayıtları siler.
Foreign Key Constraint i olan bir tabloya TRUNCATE işlemi uygulanamaz. Önce Constraint lerin silinip, TRUNCATE işleminden sonra tekrar tanımlanması gerekecektir. Ayrıca bu işlemi yapacak olan user ın db_owner,ddl_admin veya owner haklarından birisine sahip olması gerekir.

TRUNCATE işlemi sonunsa Identity alan değerleri ilk değerlerinden tekrar başlar. Örneğin 1'den başlayan Identity değeri olan ve içerisinde 100 satır bulunan bir tablo olduğunu varsayalım. TRUNCATE işlemi sonunda boş tabloya bir satır eklediğimizde alacağı değer 1 dir, fakat DELETE işleminden sonra bu değer 101 olacaktır.