Sql Server Nedir

Merhabalar, Sql Server yazılarımızın ilkiyle beraberiz. Bu yazı giriş mahiyetinde olacak ve Sql Server’in ne olduğu ile ilgili birkaç bilgi vereceğim.
Sql Server yada bir diğer adıyla MSSQL, Microsoft tarafından geliştirilen bir ilişkisel veritabanı sistemi. İlk sürümü 1989’da yayınlanan Sql Server’in şu anda 2022 versiyonu yayınlanmış ve kullanılabilir durumda. Sql Server’in sürümleri yayınlandığı yıl ismiyle anılıyor ve genel olarak yayınlandığı gün itibariyle o anki yılın adında yayınlanıyor. Örneğin 2022 versiyonu 16 Kasım 2022’de yayınlandı ve bugün itibariyle son sürümü de bu.
Sql Server, ilişkisel bir veritabanıdır, yani sütun, tablo ve veritabanı olarak 3 bölümden oluşur. Sütunlar verilerin bulunduğu alanlar, tablo sütunlardan oluşan bir birleşim, veritabanı ise tablolardan oluşan bir yapıda olup tablolar arasında bağlantılar da yapılabilmektedir. Örneğin kitaplar ve yazarlar isminde iki farklı tablo olduğunu varsayalım. Kitaplar içerisinde kitap ile ilgili bilgiler ve yazarlar da ise yazarlarla ilgili bilgiler olsun. Ayrıca yazarlar tablosunda bir tane de yazarNo sütunu olsun ve bu yazarNo sütunu kitaplar tablosunu işaret eden bir tane ikincil anahtara sahip olsun. Bu durumda yazarNo sütunu üzerinden kitaplar tablosuna bağlantı kurup oradan herhangi bir kitap hakkında bilgi alınabilir.
Az önce ikincil anahtar dedim ya, anahtarlar hakkında bilgi vermeden olmaz 🙂 Sql Server’da birincil anahtar ve ikincil anahtar olmak üzere 2 tane anahtar türü bulunmakta. Birincil anahtar genelde her tabloda bir tane bulunur ve tabloda benzersiz olmakta. Yani birincil anahtar olan sütunda bir veriden bir tane olur, tekrar eden veri olmaz. İkincil anahtar ise tablolar arasında bağlantı kurmak için kullanılan anahtarlardır ve bir tabloda birden fazla ikincil anahtar olabilir, ikincil anahtar olan sütunda da tekrar eden veri olabilir. Örneğin az önce bahsettiğim kitaplar ve yazarlar tablolarında kitapNo sütunu ikincil anahtar olabilir. Bu sayede yazarlar tablosu üzerinden kitaplar tablosuna erişim sağlanabilir. Ayrıca hem kitaplar hemde yazarlar tablolarında id adında bir sütun olabilir ve bu sütun birincil anahtar olabilir (hem kitaplar tablosunda hemde yazarlar tablosunda id sütunu olacak ve her ikisi de ayrı ayrı birincil anahtar olacak). Birincil anahtarlara “primary key” deniyor, ki bu aslında birincil anahtar kelimesinin İngilizce’si. Bir tabloya ikincil anahtar eklemek, tablonun hızlanmasını sağlar, yani veriler daha hızlı okunur.
Genelde birincil anahtar olan sütun aynı zamanda sayısal ve auto increment yani otomatik artan tipte de olur. Bir sütunun auto increment olması, o sütuna elle veri eklenmemesi demektir. Örneğin id adında bir sütun bulunur ve bu sütun auto increment yapılır ve o tabloya veri eklerken id sütununa programcı tarafından veri eklenmez, o sütunun verisini Sql Server ekler. İlk veri eklendiğinde id sütununun değeri 1, sonraki eklemede 2, sonrakinde 3, sonrakinde 4, …. böyle böyle veri eklendikçe otomatik bir şekilde artar. Böyle olması sayesinde tablonun geri kalan sütunlarındaki veriler birebir aynı da olsa id sütununun farklı olması sebebiyle istenen veriye çok daha kolay ve hızlı bir şekilde erişilmesini sağlar. Örneğin, adı Abdurrahman olan öğrencileri getirmek istediğimizde tablo içerisinde ad sütununun değeri Abdurrahman olan veriler aranacaktır. Bu işlem daha yavaş yapılacakken, id değeri 5 olan öğrenciyi aramak çok daha hızlı olacaktır. Çünkü auto increment olan verilerin yerini Sql Server bilir. id değeri 5 olan veriyi getir dediğinizde Sql Server o veriyi eliyle koymuş bulacak ve size getirecektir. Fakat adı Abdurrahman olan veriyi getirmek istediğinde tüm veriler arasında ad sütununun değeri Abdurrahman olanları arayacaktır, ki bu çok daha yavaş bir arama olacaktır.
Metinsel tipte (char, text yada varchar) olan bir sütun üzerinden veri okumak full text search adını verdiğimiz bir soruna sebep olur. Full text search, sütun üzerinden arama yapmak istendiğinde (örneğin ad’ı Abdurrahman olan öğrencilerin bulunması) Sql Server, aranan kelimeyi her bir sütunda ayrı ayrı arar ve eşleşen sonuçları getirir. Bu da verinin daha yavaş okunmasına sebep olur. Küçük yada veri sayısı az olan projelerde bu çok büyük bir etki yapmaz fakat bankacılık gibi günde binlerce işlemin yapıldığı ve her bir işleminde çok hızlı yapılması gerektiği bir sistemde bu çok büyük bir sorundur. İşte bu sorunu ortadan kaldırmasa da en aza indirmek için “indexler” kullanılmakta. Bir sütuna index ekleyerek o sütunu işaretleyebilir ve Sql Server’in veriyi kaydederken daha erişilebilir bir şekilde kaydetmesini sağlar. indexler ise clustered index ve non-clustered index olmak üzere ikiye ayrılır. Clustered index, bir kitaptaki içindekiler bölümüne benzetilebilir. Nasıl ki, kitaplarda bulunan içindekiler bölümü ile hangi konunun hangi sayfada olduğu yazıyor ve bu şekilde istediğimiz şeye çok çok daha hızlı bir şekilde erişebiliyorsak, clustered indexler ile de aynı şekilde hızlı bir şekilde erişim sağlanır. Tablodaki veriler clustered index olan sütuna göre alfabetik bir şekilde sıralanır. Yeni eklenen verinin clustered index olan sütunundaki verisine göre işlem yapılır ve veri tekrardan alfabetik olarak artan sırada sıralanır. Bu sayede hangi verinin nerede olduğu rahatlıkla bilinebilir. Non-clustered index ise bir kitaptaki fihrist bölümüne benzetilebilir. Fihrist bölümü, kitapta en çok kullanılan kelimelerin hangi sayfalarda geçtiğinin yazdığı ve genelde kitapların en arkasında bulunan sayfalardır. Örneğin “masa 5, 10, 12, 14” şeklinde bir ifade olur ve bu masa kelimesinin 5, 10, 12 ve 14. sayfalarda geçtiği anlamına gelir. Aynı şekilde Sql Server’da da non-clustered olarak atanan sütundaki veriler bu şekilde işaretlenir ve arama yapıldığında bu işaretlemelere göre aranır.
Bir tabloya birden fazla clustered veya non-clustered index eklenebilir fakat clustered indexten bir tane olması tavsiye edilir. Clustered indexler, tablo içerisindeki verilerden bağımsız bir şekilde depolandığından diskte daha fazla yer kaplar fakat hangi verinin nerede olduğu bilindiğinden veri okuması çok hızlı yapılır. Fakat her yeni veri eklemesi yada silinmesinde alfabetik yapı tekrardan oluşturulacağından veri ekleme ve silme işlemleri daha yavaştır. Bu sebepten tarih yada birbirini tekrar etmeyen sayısal ve artan sırada olan bir sütunları clustered index olarak atanabilir. Örneğin birincil anahtar olan bir sütunun yada oluşturulma tarihini tutan bir sütunun clustered index olması çok mantıklıdır çünkü bu veriler birbirini tekrar etmeyecektir. Veri okuma hızlı olsa da yeni bir veri eklenmesi yada var olan bir verinin silinmesinden dolayı bu işlemler yavaş olduğu için clustered index kullanırken dikkatli olunmalıdır.
Sql Server’da tıpkı bir programlama dilinde olduğu gibi fonksiyonlar bulunmakta ve hatta if-else ve switch-case gibi karar yapıları ve döngülerde bulunmaktadır. Örneğin tabloya eklenecek bir verinin kontrolü verinin ekleneceği programlama dilinde yapılacağı gibi veritabanı tarafında da yapılabilir. Fonksiyonlar geriye değer döndürenler ve döndürmeyenler olarak ikiye ayrılmakta. Geriye değer döndürenlere fonksiyon, döndürmeyenlere procedure (prosedür) denir. Procedureler ile sadece yeni veri ekleme ve var olan bir veriyi silme yada güncelleme işlemi yapılabilir. Okuma işlemi de yapılabilir fakat geriye döndüremeyeceğinden dolayı sadece procedure içerisinde işlem yapmak için okuma yapılır. Fonksiyonlarda ise okuma, yazma, silme ve güncelleme işlemi yapılabilir ve okuma işleminin sonucu geriye döndürülebilir. Bir tablo üzerinde Sql komutu çalıştırıldığında komut öncelikle yorumlanır ve sonrasında derlenir. Yani önce komutun ne olduğu tespit edilir ve sonrasında komut yerine getirilir fakat prosedürler oluşturuldukları anda yorumlanır ve o şekilde saklanır, çağrıldıklarında ise zaten ne iş yapılacağı bilindiğinden doğrudan ilgili işlem yapılır. Bu sebeple prosedürler, doğrudan Sql komutlarından daha hızlıdır. Hız gerektiren bir projede doğrudan Sql komutları yerine komudun prosedüre çevrilip sonrasında kullanılması tavsiye edilmektedir.
Tablo içerisindeki veriler doğrudan disk üzerine yazılır ve bu şekilde saklanır. Bir tablodan veri okumak istediğinizde o tablonun diskteki dosyası okunur ve onun üzerinden işlem yapılır. Fakat view adını verdiğimiz bir yapı ile doğrudan Sql server komutlarından çıkan sonuçlar da saklanabilmektedir. Örneğin iki tablonun birleştirilerek okunması işlemi view ile oluşturulur ve kaydedilir. Bu tablolar kullanılmak istendiğinde doğrudan ilgili view çağrılır ve zaten hazır olan sonuçlar direk getirilir, her bir tablo için disk üzerinden bir okuma işlemi yapılmaz. Bu da sorgu sonuçlarının hızlanmasını sağlar.
Sql Server’da birbiriyle ilişkili olabilecek tablolar bulunabilir demiştim. Yani kitaplar tablosu üzerinden yazarlar tablosuna geçilebilir. İşte bu işleme join yani birleştirme denir. Join işlemlerinin de çeşitleri bulunmaktadır. Left join, right join, inner join, outer join bunlardan birkaçıdır. Left join soldaki tablo (Sql komutuna göre solda yazılan tablo) ile iki tablonun kesişimini getirirken, right join sağdaki tablo (Sql komutuna göre sağda yazılan tablo) ile kesişimlerini, inner join ise sadece kesişimlerini getirir. Kesişimler çok büyük çoğunlukla ikincil anahtarlar üzerinden yapılır ve birleştirme işlemi de yine ikincil anahtarlar üzerinden geçer.
Evet, Sql Server hakkında bu kadar teorik bilgi vermem yeterli olacaktır diye düşünüyorum. Zaten her birini ayrı ayrı yazılarda anlatacağım. Bu yazımızında sonuna geldik, herkese hayırlı günler.