SQL (nolock)

SQL bazı drumlarda verileri kilitler. Örneğin bir tabloya update çekiyorsunuz ya da bir transaction başlattınız. Ama transaction henüz sonlanmadı. Bu tür durumlarda SQL dataya diğer connection’lardan erişimi durdurur.

Şimdi sizinle şöyle bir deney yapalım ;

SQL Server Management Studio’yu açalım ve “New Query” butonuna 2 defa tıklayarak 2 adet boş query penceresi açalım

nolock1

Management studio da 2 adet query penceresi demek, aslında sql server a oluşturulmuş 2 farklı bağlantı demektir. SQLQuery1.sql penceresinde yukarıda görüldüğü gibi  “Begin Tran” ve alt satıra bütün bir tabloyu UPDATE eden bir script yazın. Şimdi query i çalıştırın. Update ettiğiniz tabloya select çektiğinizde update ettiğiniz bütün alanların değiştiğini görüceksiniz. Aslında daha değişmedi siz “Begin Tran” ile başlattığınız transaction ı commit edene kadar hiçbir değişiklik veritabanına kaydedilmez ve siz commit verene kadar, yani “Commit Tran” yazana kadar SQL server tablodaki kayıtları kilitler. Kimse bu tablodan select ile bu verileri görüntüleyemez. Sizin çektiğiniz Select çalıştı ama değil mi. Bunun nedeni sizin Transaction ı başlattığınız aynı connection ile select çekiyor olmanız. Aynı Query Penceresinde olmak burada aynı connection da olmak demektir.

nolock2

Şimdi aynı select i açtığımız diğer Query Penceresinden yani SQLQuery2.sql den deneyelim

Select imizi SQLQuery2.sql penceresinde çektiğimizde, alt tarafta görüğümüz executing query yazısının sürekli orda olduğunu görürsünüz. Diğer connectiondan açtığınız transaction henüz tamamlanmadığı için verileriniz hala kilitli ve  onlara, şu anda başka bir connection da olduğunuz için ulaşamıyorsunuz. Bu select cümleciğinin size istediğiniz listeyi getirebilmesi için SQLQuery1.sql penceresinde, ilk resimde — işareti ile commitlenen”rollback tran” cümleciğini — işareti olmadan, yani commitsiz yazmalı ve çalıştırmalısınız. Tabi eğer yaptığınız Update e onay vermek istiyorsanız; “commit tran” cümleciğini de kullanabilirsiniz.

İşte böyle durumlarda çektiğiniz bir sorgunun bir nesnenin kilitli olmasına bakmadan size listesini getirmesini istiyorsanız yukarıdaki select cümleciğini şu şekilde yazmalısınız;

Select * from [AdventureWorks2008R2].[HumanResources].[Employee] (nolock)

Bu durumda sql ulaşmak istediğiniz verinin kilitli olup olmadığına bakmadan listeyi size vericektir. (Nolock) olayı bir çok durumda yapmış olduğunuz sorguların kilitleri beklemesini engelleyeceğinden programlarınızın daha hızlı çalışması için tercih edeceğiniz bir yöntemdir. Fakat yine de verilerin ne zaman nolock ile çekileceğine karar vermek dikkatli düşünülmesi gereken bir iştir. Çünkü verileriniz biryerlerde işleniyor ve süreç henüz sona ermedi. Siz sürecin sona ermesini beklemek istiyor musunuz? Yoksa bu durum sizin mevcut şartlarınızda önemsiz mi? Karar verilmesi gereken asıl nokta budur.

 

SQL Union All

Aynı sıra ile aynı veritipi bilgileri içeren 2 sorguyu birleştirmek istediğimizde birleştirmek istediğimiz query ler arasında “union all” kullanırız

Örneğin ;

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Design Engineer'

şeklinde bir sorgumuz var çıktısı aşşağıdaki gibi

SQLUnion1

Burada görevi ‘Design Engineer’ olan çalışanları görüyoruz.

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Marketing Assistant'

Sorgusunu yaparak ta görevi ‘Marketing Assistant’ olan çalışanların listesini alalım

SQLUnion2

Şimdi bu iki sorguyu “union all” ile birleştirelim.

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Design Engineer'
union all
SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Marketing Assistant'

Artık aşağıda gördüğünüz gibi iki sorguyu birleştirerek, görevi ‘Marketing Assitant’ ve ‘Design Engineer’ olan  çalışanların listesini almış olduk

SQLUnion3

CLOUD COMPUTING Aldatmacası

Son zamanlarda bir “Cloud Computing” hikayesi anlatılır oldu. Buna göre insanlar artık masaüstü uygulamaları kullanmak ve verilerini geleneksel bilgisayarlarında saklamak yerine, internet üzerindeki ortamlarda çalışacaklar ve dökümanlarını yine bu internet üzerindeki ortamlarda saklayacaklarmış. Büyük ölçekli firmaların artık kendi veritabanı serverlarını, file serverlarını almayıp, bunlar yerine internet üzerinde bir yer kiralayarak yada satın alarak uygulamalarını buralardan çalıştıracakları, paylaşılması gereken dökümanlarını buradan paylaşacakları, verilerini burada saklayacakları gibi laflar dolaşıyor ortalıkta. Şu anda bu söylenen şeyler bana pek gerçekçi gelmiyor doğrusu. Bu konu hakkında bir kaç makale okudum. Okuduğum makalelerde bu çalışma sisteminin faydası olarak ; Düşük Maliyetler, Yüksek depolama, Veri güvenliği alanları gibi şeylerden bahsediliyor. Haydi işiniz yoksa bunlar hakkında biraz düşünelim.

Birincisi ; Düşük Maliyetler. Genelde şöyle bir açıklaması var bu sistemi savunan arkadaşların; Bir iş kurarken yapmanız gereken donanım maliyetinden kurtulmuş olacaksınız diyorlar. Bu bence safsatadan başka birşey değil. İnternetteki o boş yeri de size bedava vermiyecekler sonuçta. Aylık ya da yıllık bir bedel ödeyeceksiniz mutlaka. Server alamayacağınız için (ama bu hizemete erişebilmek için bilgisayarınız olacak değil mi?), olmayan server’ınızın  bakımını ve ayarlamalarını yapmak için de personele ihtiyaç duymayacakmışsınız. Arkadaşlar yapmayın. Sizin bakım yapmak için adama ihtiyacınız olmayabilir ama o internet üzerindeki alanın hala bakıma ihtiyacı var ve bu hizmeti sağlayan arkadaşlar bu bakımı yapacaklar da. Tabi bunu hayrına yapmayacaklar. Bunun da bedelini faturanızda göreceksiniz. Bir de personelinizin bu hizmeti kullanabilmesi, internet üzerindeki o alana erişebilmesi için hala bilgisayara ihtiyacı var unutmayın. Onların bakımını kim yapacak peki? Geleneksel yöntemlerde şirket bünyesinde çalışan IT ekibi bu işleri de üstlenir. Demekki neymiş? Server haricindeki cihazlar için de birilerine ihtiyaç varmış. O halde demekki IT maliyetiniz olmak zorunda. Siz ne yaptınız IT maliyetine, size cloud hizmeti veren firmanın IT masrafını da eklediniz. Çünkü yukarıda dediğim gibi onların da bir bakım masrafı olacak ve bunu size yansıtmak zorundalar.

İkincisi ; Yüksek depolama kapasiteleri. Peta Byte yani 1 Milyon GB gibi depolama alanlarından bahsediliyor. Bu belki iyi bir özellik olabilir. Ama gene de büyüklüğün faturaya yansıyacağını düşünüyorum ben. Üstelik kullanılmayan işlevsiz büyüklüğün bile 🙂

Üçüncüsü; Veri güvenliği! Yaw veri nasıl olur da internette hiç bilmediğim bir bilgisayar üstünde hiç tanımadığım kişilerin ellerinde, benim dizimin dibinde duran istediğim zaman müdehale edebildiğim, istediğim antivirüs, firewall uygulamaları ile koruyup, istediğim gibi RAID yaptığım ve ne yaptığımı bildiğim ve yedeklediğim bir yerden daha güvende olur. En basitinden o hizmeti size sağlayan adamlara bile güvenebileceğinizi zannetmiyorum. Bence hiçbir şirket çok gizli ve(ya) değerli verilerini böyle bir ortamda tutmak istemez.

Benim bu CLOUD COMPUTING ten anadığım bunlar arkadaşlar. Eğer bu konu hakkında yanlış bir bilgim varsa yada yanlış kaygılarımın olduğunu düşünüyorsanız beni aydınlatın lütfen. Teşekkür ederim.

SQL de WITH CHECK OPTION

Örneğin bir sınıfta matematik dersinden 45 in altında not alan öğrencileri gördüğümüz basit bir view’ımız var

Create View DusukNotlar
as
Select Adi,Soyadı,Ders,Not from tblDersNotlari where Not<45

Şimdi diyelimki bu view a bir insert yapmamız gerekti;

insert into DusukNotlar
Select 'Barış','Eldem','Matematik',80

Bu insert script’ini çalıştırdığımız zaman SQL yeni kaydı girecek fakat kayıt viewde gözükmeyecektir. Çünkü view’in scriptinde not<45 diye belirtilmişti. Halbuki bizim girdiğimiz not 80.

Eğer SQL’in bu şekilde view’a göremeyeceğimiz bir kaydı insert emeye izin vermesini engellemek istersek, view’ımızı WITH CHECK OPTION ile yazmamız gerekir. Bu durumda view’ımız aşağıdaki gibi olacaktır;

Create View DusukNotlar
as
Select Adi,Soyadı,Ders,Not from tblDersNotlari where Not<45
WITH CHECK OPTION

SQL’de stored procedure içinde text arama

Bazı durumlarda bir kelimenin, veritabanındaki hangi sp’ler içinde geçtiğini öğrenmeniz gerekebilir. Örneğin bir tablodaki bir alan adını değiştirdiniz ve bu alan adının içinde geçtiği bütün procedure’leri bulup değiştirmeniz gerekiyor. Bu durumda şöyle ufak bir script size yardımcı olabilir;

SELECT OBJECT_NAME(id) 
    FROM syscomments 
    WHERE [text] LIKE '%bulunacak text%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

Bu script çalıştığında içinde aradığınız kelimeyi (bulunanacak text) içeren bütün sp’ler listelenecek ve sizde bunları değiştirerek muradınıza ermiş olacaksınız.