2008-10-23

Transaction Blok İçerisindeki Lokal Değişkenlerin Durumu

Bana göre uzun sayılabilecek bir aradan sonra tekrardan sizlerleyiz efendim.

Bu sefer lokal değişkenlerin transaction yapısı içerisindeki durumunu hep birlikte inceleyeceğiz. Öncelikle hatırlayamanlar için transaction yapısını hatırlatalım:

BEGIN TRAN
--Ara işlemleriniz
COMMIT TRAN
--yada
ROLLBACK TRAN

Bu hatırlatmadan sonra asıl konumuz olan lokal değişkenlerin transaction yapısındaki durumuna dönelim. Bunun için birbirine çok benzer iki örnek üzerinde duralım:

Örnek-1:
DECLARE @OnlineZiyaretci INT
SET @OnlineZiyaretci = 10

PRINT @OnlineZiyaretci --OnlineZiyaretci değeri 10

BEGIN TRAN
SET @OnlineZiyaretci = @OnlineZiyaretci + 1
PRINT @OnlineZiyaretci --OnlineZiyaretci değeri 11
ROLLBACK TRAN

PRINT @OnlineZiyaretci -- Burdaki değeri tahmin edin?
GO

Örnek-2:
DECLARE @OnlineZiyaretci INT
SET @OnlineZiyaretci = 10

PRINT @OnlineZiyaretci --OnlineZiyaretci değeri 10

BEGIN TRAN
SET @OnlineZiyaretci = @OnlineZiyaretci + 1
PRINT @OnlineZiyaretci --OnlineZiyaretci değeri 11
COMMIT TRAN

PRINT @OnlineZiyaretci -- Burdaki değeri tahmin edin?
GO

Normal şartlarda bir kayıt yada kayıt kümesi için rollback olduğunda o kayıtlar eski haline döner; commit olduğunda ise transaction blok içerisinde aldığı son değerleri alır .
Eminim bir çoğunuz aynı mantıkla @OnlineZiyaretci değişkeninin örnek-1 için 10; örnek-2 için ise 11 alacağını tahmin etmişsinizdir. Kodu denerseniz tahminizde yanıldığınızı; her iki durumda da @OnlineZiyaretci değerinin 11 olduğunu göreceksiniz. Bunun nedeni lokal değişkenlerin Transaction yapısından etkilenmemeleri!

Bir sonraki yazıda görüşünceye dek bol SQL'li günler diliyorum.

2008-10-21

Yorum Farkı!

Yazının başlığına bakıp Mehmet Barlas ile Emre Kongar'ın sunduğu Yorum Farkı programına değineceğimi zanneden arkadaşları üzmek istemesemde bugün farklı bir Yorum Farkına değineceğim. Bugün daha önceleri almayı düşündüğüm fakat bir firma tarafından alınmış olan yorum.com domain name i satın almış olsaydım altında hangi sub domainleri barındıracağımı düşündüm. İşte kısa bir düşünmeden sonra aklıma gelen sub domainler:

1- ali.yorum.com (Alış, alıcı yorumları)
2- aci.yorum.com (Acıya, bibere dair yorumlar)
3- oku.yorum.com (Okuyucu, kitap yorumları)
4- ucu.yorum.com (Uçuş,uçak yorumları)
5- soru.yorum.com (Soru Merkezi)
6- baki.yorum.com (Bakıcı yorumları)
7- bulu.yorum.com (Arama Merkezi)
8- gulu.yorum.com (Gülmeye Dair)
9- suru.yorum.com (Sürüş, sürücü yorumları)
10-goru.yorum.com (Görmeye dair yorumlar)
11-gezi.yorum.com (Gezi yorumları)
12-kosu.yorum.com (Koşu yorumları)
13-gozlu.yorum.com (Göze dair, gözlüğe dair yorumlar)
14-oynu.yorum.com (Oyun yorumları)
15-sati.yorum.com (Satış, satıcı yorumları)
16-dusunu.yorum.com (Düşünceye dair yorumlar)
17-unutu.yorum.com (Unutkanlık üzerine yorumlar)
18-usutu.yorum.com (Soğuk algınlık ile ilgili yorumlar)
19-yuzu.yorum.com (Yüzmeye dair yorumlar)
20-bili.yorum.com (Bilgiye dair yorumlar)
21-calisi.yorum.com (Çalışma hayatına dair yorumlar)
22-odu.yorum.com (Ödemelere dair yorumlar)

Bakalım sizin aklınıza hangi varyasyonlar gelecek?

2008-09-26

Kadir Gecesi ve Ramazan Bayramı

Kadir Gecenizi ve Ramazan Bayramınızı tebrik ederek; bu mübarek gecenin ve bayramın hayırlara vesile olmasını gücü herşeye Kadir olan Cenab-ı Hak'tan niyaz ederim.

Ya Mütekebbir!
Ben acizim sen Kadir’sin
Ben fakirim sen Rahim’sin
Ben ölüyüm sen Hayy’sın
Ben çaresizim sen Ehad’sin
Ben muhtacım sen Samed’sin
Ben sağırım işiten sensin
Ben körüm gören sensin
Ben dilsizim konuşan sensin
Ben yaratılıyorum yaradan sensin
Ben yokum var eden sensin
Ben hiçim ama emellerim büyüktür
Ben yoksulum ama isteklerim çoktur
Ben isterim çünkü sen büyüksün
Şahit yaz büyüklüğüne bu küçük kalbimi!

2008-08-28

Temporary Table mı Table Variable mı Kullanmalıyız?

Aynı soru defalarca kez farklı yerlerden geldiği için sorunun cevabına değinme ihtiyacı hissettim.
  1. Eğer satır sayımız 100'ün altındaysa genellikle table variable'ı kullanırız. Satır sayısı 100 ün üzerindeyse temporary table kullanılmalıdır.
  2. Index oluşturma ihtiyacımız varsa kesinlikle temporary table kullanmalıyız.

Temporary table ile table variable arasındaki farklardan birisi temporary table sistem veritabanlarından birisi olan tempdb'de tutulur.Table variable ise sistem hafızasında(memory) yer alır.

Burdan hareketle her şeyi temporary table/table variable üzerinde tutup tempdb/memory ı şişirmeyin. Gerekli yerlerde gerektiği kadar kullanalım. Yazılım geliştirme ile uğraşan arkadaşların zamanı dar olduğu çoğunlukla bol temporary table kullanıp bu temporary table'lar üzerinde envai çeşit ekleme/çıkarma/güncelleme yaparlar.

Bir örnek vermek gerekirse: Maas tablosunu tamamını temporary table'a atıp personel maaşını %10 temp table üzerinde uygulayan bir arkadaş SQL kodunu aşağıdaki gibi yapacaktır:

SELECT Sicilno, Ad, Soyad, Ucret INTO #MaasTemp
FROM Maas

Update #MaasTemp
SET ucret=ucret*1.1

Bunun yerine Maas tablosundaki verileri temp tabloya atarken %10 zammı ekleyelim.

SELECT Sicilno, Ad, Soyad, Ucret*1.1 INTO #MaasTemp
FROM Maas

Temporary table için daha söylenecek çok şey var ama şimdilik benden bu kadar. SQL kodumuzu yazarken sistem performansına etkisini de gözönünde bulundurmayı unutmayalım.

Bol SQL'li günler diliyorum.

2008-08-07

SQL Server 2008 RTM Yayınlandı

Uzun bir süredir beklediğimiz SQL Server 2008 RTM sürümü nihayet yayınlandı. En son Şubat 2008'e yetişeceği bildirilmişti fakat Şubat 2008'e yetişemeyince ilerleyen dönemlerde Release olacağı söylenmişti. Bu bildiriden çoğu kişi SQL Server 2008 RTM'in Kasım 2008 gibi çıkacağını bekliyordu. Açıkçası SQL Server 2008 RTM'in çıkması beklediğimden erken oldu.

MSDN üyeliği bulunananlar SQL Server 2008 RTM'i aşağıdaki adresten indirebilir:
http://technet.microsoft.com/tr-tr/subscriptions/default(en-us).aspx

2008-07-29

Miraç Kandilinizi Tebrik Ederim

Bu mübarek gecede dualarınızın kabul olması dileklerimle Miraç Kandilinizi tebrik eder; siz ve sevdikleriniz hakkında hayırlara vesile olmasını dilerim.





2008-07-16

SQL Server'da İstatistikleri Görüntüleme

SQL Server'daki istatistiklerin isimlerini ve hangi alanlardan oluştuğunu görmek için sp_helpstats stored procedure'; istatistiklerin detay bilgilerine ulaşmak için ise DBCC SHOW_STATISTICS komutunu kullanabilirsiniz.

SQL'de Kodu Kısaltmak Her Zaman Yararlı Değildir!

SQL de tablo adlarını alias ile kısaltmak çoğu zaman yazacağımız kodu kısaltır ve kodun anlaşılabilirliğini artırır. SQL kısaltmalarını bir çok yerde desteklemekle birlikte sakıncalı olabilecek yerlerde de dikkat etmenizi öneririm.

SQL kodlayan yazılımcılar arasında sıklıkla yapılan hatalardan birisi de kısaltma hastalığı neticesinde yanlış tabloyu update etmektir. SQL kodunu kısaltayım derken iş ömrünüzü kısaltmayın!

Örnek: 1 nolu şirketteki personelin statu sunu 0 yapacak kodu yazmaya çalışalım:

update s
set statu=0
from personel p inner join sirket s ON P.sirketid=S.id
where S.id=1

Yazdığım kod kısa olduğu için hatayı hemen yakalamak mümkün ama SQL kodu çok uzunsa hatayı yakalamak zor olabilir. Yukarıda yapılan hata personel durumlarını update edeyim derken şirket durumu update edilmiştir. Her iki tablodada statu alanı olduğu için kod çalıştırıldığında düzgünmüş gibi çalışıp, kodu yazanın yanılmasına sebep olur.Bu konuda sizlere acizane tavsiyem update edeceğiniz tablo adını uzun bir şekilde yazmanız.

Şimdi hatamızı düzeltip SQL kodumuzu daha okunabilir bir şekilde yazalım:

UPDATE Personel
SET statu=0
FROM Personel INNER JOIN Sirket ON Personel.sirketid=Sirket.id
WHERE Sirket.id=1

Tabiki yapacağınız işleri TRANSACTION block içerisinde yazmak her zaman daha güvenli olacaktır ve yaptığınız hatadan dönme şansını size verecektir:

BEGIN TRAN

UPDATE Personel
SET statu=0
FROM Personel INNER JOIN Sirket ON Personel.sirketid=Sirket.id
WHERE Sirket.id=1


COMMIT TRAN

Herkese hatasız ve performanslı bol SQL li günler...

2008-07-03

Regaib Kandili

Mübarek Regaib Kandili'nizi tebrik eder, hayırlara vesile olmasını dilerim.

2008-06-30

Job Adımlarının-Komutlarının Detay Bilgileri

Hangi jobın hangi adımları var? Hangi adımlarda hangi komutlar çalıştırılıyor? sorularını siz de merak ediyorsanız aşağıdaki SQL kodu sorularınıza cevap olacaktır:

SELECT name, step_id , step_name, command
FROM msdb.dbo.sysjobs J INNER JOIN msdb.dbo.sysjobsteps JS ON JS.job_id=J.job_id


--SQL kodu SQL Server 2008 RC0 ve SQL Server 2005 sürümlerinde test edilmiştir.

2008-06-13

SQL Server 2008 ile Oracle'ın Bazı Özelliklerinin Karşılaştırılması

Geçen gün SQL Server 2008 White Papers ı okurken; SQL Server 2008 ile Oracle 11g nin bazı özelliklerinin karşılaştırılması dikkatimi çekti. Merak ettiğim bir konuyu sizlerle de paylaşmak istedim. Ayrıntılı bilgi için SQL Server 2008 Compared to Oracle Database 11g White Paper ını okuyabilirsiniz.

Hem SQL Server 2008 hem de Oracle 11g de olan bazı özellikler:
  1. Feature Microsoft OracleResource Governor
  2. Partition-aligned indexed views

Sadece SQL Server 2008'de olan özellikler:

  1. PowerShell
  2. Policy-Based Management
  3. Filtered indexes
  4. Advanced sparse columns
  5. Multithreaded partition access
  6. Column-prefix compression
  7. Module signing using certificates
  8. SQL Server Data Services

.::YASAL UYARI::.

©2004-2023 Mehmet GÜZEL, www.mehmetguzel.net

Site içeriği kaynak gösterilmek koşuluyla yayınlanabilir. Yazılan yazı ve yorumlar sadece yazı ve yorum sahiplerini bağlar.