t-sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
t-sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

6 Nisan 2011 Çarşamba

LEFT OUTER JOIN Örneği

Bir öğrencimin isteği üzerine yayınlıyorum! İyi Çalışmalar..

/*Amaç birden fazla kategoriye dahil edilebilen bir ürün kategorilendirme sisteminde
  hangi üsünün hangi kategoriye ait olduğunu ve hangi kategoriye ait olmadığını bulmak!*/

--> Tablolarımız :

   CREATE TABLE [dbo].[TBLCategories](
 [CategoryID] [int] IDENTITY(1,1) NOT NULL,
 [CatName] [varchar](50) NULL,
 [RegisterDate] [datetime] NULL,
 CONSTRAINT [PK_TBLCategories] PRIMARY KEY CLUSTERED
(
 [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[TBLCategories] ADD  CONSTRAINT [DF_TBLCategories_RegisterDate]  DEFAULT (getdate()) FOR [RegisterDate]
GO 

 
CREATE TABLE [dbo].[TBLProducts](
 [ProductID] [int] IDENTITY(1,1) NOT NULL,
 [ProductName] [varchar](50) NULL,
 [Price] [money] NULL,
 [RegisterDate] [datetime] NULL,
 CONSTRAINT [PK_TBLProducts] PRIMARY KEY CLUSTERED
(
 [ProductID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[TBLProducts] ADD  CONSTRAINT [DF_TBLProducts_RegisterDate]  DEFAULT (getdate()) FOR [RegisterDate]
GO 



   CREATE TABLE [dbo].[TBLJoinProductCategory](
 [JoinID] [int] IDENTITY(1,1) NOT NULL,
 [ProductID] [int] NULL,
 [CategoryID] [int] NULL,
 [RegisterDate] [datetime] NULL,
 CONSTRAINT [PK_TBLJoinProductCetegory] PRIMARY KEY CLUSTERED
(
 [JoinID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[TBLJoinProductCategory] ADD  CONSTRAINT [DF_TBLJoinProductCetegory_RegisterDate]  DEFAULT (getdate()) FOR [RegisterDate]
GO



--> Şimdi İstediğimiz sorguları yazalım!!
-- Öncelikli olarak LEFT OUTER JOIN anahtar kelimesi kullanmadan sonuç alalım!
-- Mouse Ürünü İçin!!
-- Bulunduğu Kategorileri Bulmak
select P.ProductName as 'Ürün Adı', CAT.CategoryID as 'Kategori ID', CAT.CatName as 'Bulunduğu Kategori'
from TBLJoinProductCategory JT , TBLCategories CAT, TBLProducts P
where P.ProductName='Mouse' and  JT.CategoryID=CAT.CategoryID and JT.ProductID=P.ProductID
--Bulunmadığı Kategorileri Bulmakselect P.ProductName as 'Ürün Adı', CAT.CategoryID as 'Kategori ID', CAT.CatName as 'Bulunmadığı Kategori'
from TBLCategories CAT,TBLProducts P
where P.ProductName='Mouse' and CAT.CategoryID  not in
(
  select JT.CategoryID  from TBLCategories CAT,TBLProducts P, TBLJoinProductCategory JT
  where JT.CategoryID=CAT.CategoryID and P.ProductID=JT.ProductID and P.ProductName='Mouse'
)

--> Şimdide LEFT OUTER JOIN anahtar Kelimesiyle yapalım!
--Bu işlemleri Left Outer Join yada Right Outer Join İlede Yapabilirsiniz! select * from TBLCategories CAT left outer join TBLJoinProductCategory JT
 on
JT.CategoryID=CAT.CategoryID and JT.ProductID=1
--> Product ID si 1 olan ürün için null olan yerler Bizim istediğimiz sonuçlar!

select CAT.CategoryID as 'Kategori ID',CAT.CatName as 'Bulunmadığı Kategori' from TBLCategories CAT left outer join TBLJoinProductCategory JT
 on
JT.CategoryID=CAT.CategoryID and JT.ProductID=1 where JT.CategoryID is null
 --> Yukarıdaki sorguya göre bulunmadığı kategorilerin ID numaraları ve İsimleri!

/* Yukarıda "Left outer join" anahtar kelimesi ile birleştirilmiş va herhangi bir join anahtar
 kelimesi kullanmadan birleştirilmiş tablolardan dönen sonuçlar var.
 İki sonuçta istediğimiz sonuç fakat "Left outer join" ile yaptığın birleştirme her zaman daha
 efektif bir sonuç verecektir!. Hızlı olacaktır!

İyi Çalışmalar
Ali Emrah PEKESEN */

26 Temmuz 2010 Pazartesi

Connection Pooling Neden Önemlidir?

Öncelikle Connection Pooling kavramını bilmeyenler için kısa bir açıklama yapayım.

Connection pooling , veri tabanı ile bağlantı kurduğumuz uygulamalarımızda veriye erişim için kullancığımız connection türlerini bir defalığa mahsus havuza atmamızı ve daha sonra aynı connectiona ihtiyaç duyduğumuzda yeni bir connection oluşturmak yerine havuzda var olan connection üzerinden verilerie erişmemizi sağlayan tekniktir diyebiliriz.

Çok kullanıcılı ve veri yükü fazla olan sistemlerde işlerimizi hızlandırmak adına çok avantaj sağlamaktadır. Örneğin 500.000 satırdan oluşan bir veri kümemize erişim hakkı olan 100 kullanıcımız var diyelim.

Herbirisi sisteme girdiğinden ayrı ayrı connection oluşturulu sorgu çalıştırıldığında sistemin performansı ne olur?
Yada connection pooling yaptığımızda sistemin performansı ne olur?

Sanırım kullanım amacını az çok kavradık.

Şimdi işlemimizi kısa bir örnekle pekiştirelim..

Önce Pooling Özelliğini False Yaparak 5000 Kere Bağlantının Açılıp Kapandığında Geçen Süreye Bakalım..


Sonrada Pooling Özelliğini True Yapalım ve 5000 Bağlantıya Tekrar Bakalım!
Not : Eğer False Yapmazsanız Zaten Default Olarak True Olacaktır.

Sanırım Açıklayıcı Olmuştur.. İyi Çalışmalar..

19 Temmuz 2010 Pazartesi

SQL Server ' da "Truncate Table" İfadesi Ne İşe Yarar?

Merhabalar,

Bu ifadedeyi az evvel bir uygulama esnasında kullanıyordum ve aklıma gfeldi sizlerede yararı dokunabilir diye buraya açıklamak istedim.

Truncate ifadesi ne iş yapar?

Truncate yaptığı işe bakılırsa, tabloyu drop etmeden içindeki tüm verileri silmeye yarar. Şimdi bazılarınızın aklına şu sopru gelebilir :

E zaten Delete bu iş için kullanılmıyor mu?
örn : "delete from XXX" (where ifadesi olmadan kullanılırsa evet tablodaki tüm verileri siler!!

Ama  burada dikkat etmemiz gereken iki önemli nokta var. Hemde gerçekten çok önemli!!

Delete ile yaptığımız bu işlemde en son kaydımızın ID numarasının 250 olduğunu varsayalım. Tablodaki tüm verileri sildik ama yeni bir kayıt eklemek istediğimizde ID numarası 251 olacaktır. Ve bunu istemeyiz!!

Ayrıca en önemlisi, varsayalımki siz ilgili tablodan bir kayıt silindiğinde bi iş gerçekleşmesi için bir trigger yazdınız ve 250 kayıt silindi, dolayısıyla 250 kere bu trigger çalışacaktır.

Fakat TRUNCATE kullandığımızda tablomuzda ID numaralarınız tekrardan 1den başlayacak şekilde temizlenecektir ve hiç bir trigger bizi farkedemeyecek dolayısıyla tetiklenmeyecektir.

Aradaki farkları net ifade ettim sanıyorum..

Bu arada kullanımına örnek verecek olursak : "truncate table XTable"

SQL Server'da "SET NOCOUNT ON" Ne İşe Yarar..

Bildiğimiz gibi SQL serverda herhangi bir tablo üzerinde bir manipulasyon yaptığımızda
-insert,update,delete,select- ( Herhangi bir tanesi olması yeterli!)
"X rows affected." Şeklinde bir mesaj alırız. Bu mesaj SQL server üzerinde yapılan işlemden sonra kaç satırın etkilendiğinin sayılması ardından bize dönen mesajdır.

Fakat çok sayıda satırın etkilendiği durumlarda, bu binlerce hatta milyonlarca olabilir, etkilenen satırların teker teker sayılıp bize bu sonucun döndürülmesi pek isteyeceğimiz bişey olmayacaktır performans açısından. Dolayısıyla bu özelliği kapatmak isteyebiliriz.


Bunun için yazdığımız sorgunun üstüne "SET NOCOUNT ON" yazmamız yeterlidir. Aksini istersekte tahmin edebileceğiniz gibi "SET NOCOUNT OFF" yazarız.

Şimdi bu durumları örnekleyerek daha iyi anlayalım..

Tablomuzda herhangi bir ayar yapmazsak satır sayma özelliği aktif olarak gelecektir. ..

SET NOCOUNT Özelliğini ON Yaptığımızda Aldığımız Sonuç..



Özelliği Tekrar OFF Hale getirdiğimizde , sorguyu tekrar çalıştırtıyoruz ve aldığımız sonuç yine satırların sayıldığını gösteriyor..



Umarım Anlaşılır bir açıklama olmuştur..