SQL Server Veri Tipleri - İndeksleme - Excel’e Veri alma ve Dipnotlar

Okan Özşahin
5 min readJan 6, 2021

--

Bu yazımda aldığım SQL eğitimlerinde zorluk çektiğim konuları içeren notlarımdan paylaşımlar yapmak istedim. Ve en sonda SQL Server’dan excel’e veri almayı göstereceğim.

Her karakter 0 ile 255 arasında değer alır. Yani 1 byte’tır (2⁸=256). varchar(20) 20 karakter demektir. char yada varchar alana max 8KB’lık bir data eklenebilir. SQL verileri temel olarak 8KB’lık Page’ler halinde tutar. 8KB’ı geçen değer SQL Server’ın yönetebileceği bir değer olmamış olur. Standart olmayan Ulusal diller için char ve varchar yetersiz kalacaktır.2⁸ değer, genel alfabetik ifadeler için uygundur. Yani çin alfabesi ve ya kiril alfabesi kullanmak istediğimizde yetersiz kalacaktır. Onların yerine nchar ve nvarchar kullanılabilir. nchar ve nvarchar’ın her bir karakterinin kapladığı alan 2 byte’tır. char ve varchar max 8000 karakter olabilirken nchar ve nvarchar max 4000 karakter olabilir. Bu veri tiplerinin hepsi temelde aynı amaca hizmet etmektedir; Text veya String verilerini saklamak.

varchar(20) dediğimizde değişkenin içerisine 20 karakteri geçmeyecek şekilde atadığımız string ifade kaç karakterse o karakter kadar veritabanında yer tutacaktır. Char’da ise char(10) dersek ve değişkene “okan” stringini atarsak içerde onu “okan” stringinden sonra 6 boş karakter olacak şekilde tutacaktır.

text, ntext 2008'den önce kullanılan yapılardı. Bunların yerine varchar(max), nvarchar(max) 8000 karakterin yetmediği alanlarda kullanmak için tercih edilebilirler. Bu tip eski veri tiplerinin halen daha kullanılıyor olmasının nedeni geçmişe dönük verilerin uyumluluk sorunu yaşamaması içindir.

Varbinary(max) dosya boyutundan bağımsız resim, video, text dosyalarını binary olarak tutar. Binary veri tipi INSERT etmeye bir örnek vermek istiyorum;

INSERT INTO TEST(BINARYALAN) VALUES(CONVERT(VARBINARY(MAX), ‘MERHABA’))

SQL’de kullanılan biraz daha az bilinen ama genel bilgi olması açısından bir kaç veri tipini daha sizlerle paylaşmak istedim. Bunlar;

XML: HTML diline benzer şekilde, hiyerarşi temelli işaretleme dillerinden biridir. Ancak burada kullandığımız etiketler, HTML ’den ayrı olarak, manuel olarak düzenlenebilir. SQL’de ise bu yapı String formatında değil de XML formatında veriyi tutar yani Sorgulanabilir string olarak düşünebiliriz.

GUID: unique identifier global olarak tekilliği garanti eder.

hierarchyid: hiyerarşik yapılarda hiyerarşideki pozisyonları temsil etmek için kullanılır.

geography: Dünyadaki koordinat sistemini tutar. Dünyanın eğimlerini de hesaba katar. enlem-boylam bilgisini tutan yapı denebilir.

geometry: Euclidean(flat) sistemi ile koordinat sistemini tutar. Sadece 2 düzlem üzerinden hesaplanır. Dünyanın eğimlerini hesaba katmaz.

geometry veri türü düzlemsel veya Öklid (düz dünya) verilerini destekler. Geometry veri türü, SQL Spesifikasyonu sürüm 1.1.0 için Açık Jeo-uzamsal Konsorsiyum (OGC) Basit Özellikler ile uyumludur ve SQL MM (ISO standardı) ile uyumludur. SQL Server, GPS enlem ve boylam koordinatları gibi elipsoidal (yuvarlak dünya) verileri depolayan geography veri türünü de destekler.

SQL’de genel tarih formatı “YYYYMMDD” şeklindedir.

TRUNCATE vs DELETE

TRUNCATE tablonun içini tamamen boşaltır. TRUNCATE’de şart yoktur. Otomatik artan değerini de sıfırlar. DELETE ve TRUNCATE arasında temelde iki fark vardır. DELETE kullanırken WHERE kullanılarak şarta göre silme işlemi yapılabiliyorken TRUNCATE komutunda böyle bir yapı yoktur. Tablonun içeriğini tamamen uçurur ve ilk oluşturulmuş haline döndürür. Bu şekilde otomatik artan ID diyelim burda sıfırlanır. Tüm tabloyu DELETE ile silersek daha sonrasında tabloya ekleme yaptığımızda ID değer kaldığı yerden devam eder. Yani TRUNCATE komutunda olduğu gibi sıfırlanmaz.

Aggregate Function’lar ile WHERE ifadesi birlikte kullanılmaz. HAVING şartı ile birlikte kullanılabilir.

WHERE kullanılacak sorgularda eğer AND şartı varsa False olma ihtimali yüksek olanları en sona yazmayı tercih edebiliriz. SQL WHERE Clause’da kontrole en sondan başlar ve yanlış tabir gördükten sonra AND görürse direkt sorguyu sonlandırır. OR’da ise doğru olma ihtimali yüksek olanları en sona yazmalıyız.Böylece doğruyu bulunca sorgudan direkt olarak çıkacaktır.

SET STATISTICS IO ON: yapılan sorgunun okuduğu page sayısı, yani arka planda sorgunun yaptığı okuma-yazma istatistiği diyebiliriz.

SELECT FORMAT(1325.567, ‘C’, ‘EN-US’) → $1325.567

Clustered Index: otomatik artan ID Clustered Index’tir. Bir tabloda 1 tane clustered index bulunabilir. Fiziken verilerin sıralı şekilde yazılmış halidir. SQL Server’da veriler ve indeksler 8KB’lık Page’ler halinde tutulur. Ve bu 8KB’lık Page’lerin fiziken verinin diske yazılmış hali primary key alanına göre olur. Bu yüzden burada otomatik artan yapıyoruz ki en sona eklenen gerçekten de sonra eklenen olsun yani ID numarası olarak. Clustered Index 1 tane olur çünkü her tabloda bir adet primary key bulunabilir. Normalizasyon yapılmış olarak düşünürsek.

non-Clustered Index: bir tabloda birden fazla bulunabilir.

Eğer bir tabloda primary key yoksa veri 8KB’lık Page’ler halinde dağınık olarak tutulur. Table scan, primary key olmadığı zaman sorgunun istediği veriyi bulmak için bütün tabloları tek tek gezerek aramasına denir. Clustered Index Scan, primary key’e göre sorgunun istediği veriyi aramasına denir. Bir tabloda primary key belirlersek otomatik olarak o kolon Clustered Index olur. Bu alan otomatik artan yani bizim sürekli örnek verdiğimiz gibi otomatik artan ID ise Clustered Index Scan, Table scan gibi tek tek bütün row’ları gezerek istenen sorguyu döndürecektir.

T-SQL’de normal bir programlama dilinde yapabildiğimiz hemen hemen her şeyi yapabilmemizi sağlar.

Fill Factor: Veritabanına veriler geldikçe indeksler bozulmaya başlar. Çünkü gelen verinin indekslere göre row’larda aralara eklenmesi gerekir. Normal şartlar altında tam olarak söylediğimiz gibi yaparsak çok maliyetli bir yapıya dönüşecektir. Bunu önlemek amacıyla indekslerin tutulduğu Page’lerde belli oranlarda boşluklar bırakılarak bu bozulmaları en aza indirgemeyi sağlayabiliriz. İndekslerin bozulmalarını önlemek amacıyla Page’lerde boşluklar bırakılır. Yeni kayıtlar geldikçe fazla yer değiştirme yapmadan kayıtlara bu boşluklara eklenir. Fill factor oranını %70 yapmamız demek Index Page’lerin doluluk oranı %70 olacak ve %30'luk kısım yeni gelecek veriler için boş bırakılacaktır. Bu durum dezavantajı da bu boş alanlar hafızada yer tutacaktır. Bu uygulamayı yaparken bunu da göz önünde bulundurmak gerekir.

Page Fillness: Page’lerin doluluk oranı.

Total Fragmentation: yeni kayıtlar geldikçe artmaya başlar. Bu artışı Fill Factor ayarlayarak düzenleyebiliriz.

Index properties →options →fill factor (microsoft management studio)

fill factor %70 yaparsak page fillness %70 olacak ve total fragmentation ciddi oranda düşecektir.(fill factor’un 0 olmasına nazaran) Bu da gelen kayıtların düzenli şekilde eklendiği anlamına gelmektedir. Dezavantajlarından biri %30'luk dedicate edildi fakat kullanılmıyor. Bu da kullanılmayan bir alanın hafızada yer tutması demektir.

server (sağ tıkla)→ properties → database settings → fill factor default değeri ayarlanabilir.

İstatistik güncellemesini otomatik olarak yapmak sisteme ekstra yük getirir. Lazım oldukça manuel güncellemesi daha çok tercih edilmeli. Durduk yere SQL Server’da bir yavaşlama hissediyorsak, SP_UPDATESTATS komutu ile İstatistik güncellemesi yapılabilir.

Son olarak excel’e SQL Server tablolarını almayı göstereceğim.

Açılan ekranda bağlanıp veri almak istediğimiz sunucu ismini giriyoruz.

Daha sonra Mevcut kimlik bilgileri kısmını seçip ilerledikten sonra veritabanı kullanıcı adımızı ve şifremizi girip sunucuya bağlanıyoruz. Ardından gelen ekranda veritabanlarımızı ve onun altındaki tablolarımızı görebiliriz.

Buradan sol tarafta istediğimiz veritabanı altındaki tabloyu seçerek önizleme ekranında nasıl bir görüntüye sahip olacağını gözlemleyebiliriz. Ardından yükle diyerek tabloyu excele yükleyebiliriz.

Bu konularla ilgili daha geniş kapsamlı bilgi edinmek ve eğitim almak isterseniz aşağıdaki eğitime göz atmanızı tavsiye ederim.

--

--

Okan Özşahin
Okan Özşahin

Written by Okan Özşahin

Backend Developer at hop | Civil Engineer | MS Computer Engineering

No responses yet