SQL Server Kullanıcıları İçin Bilinmesi Gereken İpuçları

By -

SQL Server ile ilgili (pek) bilinmeyenler

ipucu sql resim

1) sp_help bir sistem stored procedure’ü olup nesneler hakkında ayrıntılı bilgi almak için kullanılır.

2) Değer girilmemiş (NULL) olan ifadeler, gruplamalı fonksiyonlar için bir istisna olarak ele alınır.
Örneğin, SELECT MIN (price) FROM tblUrun sorgusu, en küçük ifade, fiyatı girilmemiş olan ürün gibi düşünmemize rağmen, NULL değeri döndürmez, girilmiş olan en küçük değeri döndürür.

3) İki tablo birbiri ile birleştirilerek sorgulanıyorsa (join) bu iki tabloyu farklı disklerde saklamak, seçme yapmak için geçen süreyi kısaltır.

4) Bir veritabanı tarafından kullanılan bir dosya, başka bir veritabanı tarafından daha kullanılamaz.

5) Veri ve transaction log bilgileri asla ortak bir dosyada yer alamaz.

6) Sp_spaceused sistem procedure’ü kullanarak veritabanındaki dosyaların doluluk oranları gibi özet bilgilere erişilebilir.

7) Transaction log dosyasının boyutu, Indeks ile ilgili değişiklikler yapıldığında ya da WRITETEXT,UPDATETEXT ile metin veya resim yazılırken, WITH LOG parametresi ile kullanılırsa artar.

8) Bir veritabanının boyutunu azaltma işini otomatik olarak SQL SERVER’a yaptırabiliriz (AUTO_SHRINK özelliği ile)

9) Veri tabanını silmeden önce Master veri tabanının bir kopyasını almak, daha sonrası için yarar sağlayabilir.

haha
10) IDENTITY fonksiyonu ile elde edilen değerin, her zaman tablo başına tekilliği garanti edilemez. Bu türden bir amaç için, Constraint ile ya da doğrudan unique index tanımlamak gerekir.

11) IDENTITY fonksiyonu ile üretilen primary key için üretimden sonra hata oluşursa bir sonraki seferde aynı sayı kullanılmaz. Bu nedenle, primary key’ler arasında açıklıklar kalabilir.Bu türden bir durumu toleransı olmayan durumlarda NEWID() fonksiyonu ile UNIQEIDENTIFIER türü ikilisinin kullanılması önerilir.

12) Çok güncellenen veriler XML olarak saklanmamalıdır.

13) Bir tabloya, kayıt girildikten sonra sütun eklenecekse, bir sütun NOT NULL ile tanımlanırken dikkatli olmak gerekir. Hesaplanmış sütun veya default değer tanımlanması olmadan bu işlem gerçeklenemez.

14) Foreign key Constraint ile ilişkilendirilmiş iki tablodan, foreign key’in bulunduğu tablo üstünde bir kullanıcının değişiklik yapabilmesi için birincil tarafa en azından SELECT ve REFERENCES hakkında verilmesi gerekir.

15) Foreign key ile sağlanan veri bütünlüğü, sadece bir veritabanı içerisinde tanımlanabilir. Farklı iki veritabanıdaki tablolar arasında veri bütünlüğü sağlayabilmek için Trigger kodlamak gerekir.

komik sql

16) Her zaman where koşuluna sütunları kapsayan şartlar vermek zorunluluk değildir. Bir sorguda öylesine şartlarda verilebilir. (where 1=1 deyimi, arama yapmak üzere dinamik SQL oluşturulurken takip eden şartların sayısı bilinmediğinde ilerlemek için kullanılan bir yöntemdir.)

17) Order By kullanılırken, sıralamaya katılan sütunların seçilen sütunlardan olması gerekmez bunun aksine türetilmiş sütunlarda sıralamada kullanılabilir.

18) Sütunlara verilen takma adlara Order by tarafından erişilemez.

19) Tarih alanları sorgularken format problemi çekmemek için YYYY-AA-GG SS:DD:ss şeklinde string olarak istediğiniz tarihi vererek tarih kıyaslaması yapabilirsiniz.

20) SQL server’da bir sorgunun sonucu türetilmiş tablo olarak kullanılacaksa (sub query) hesaplanmış bütün sütunlara bir takma ad verilmelidir.

21) Join ifadeleri, sorgu veya tablo sonuçlarını yatay olarak birleştirmek maksatlı kullanılır. Düşey birleştirme için UNION deyimi kullanılır.

joinler
22) INNER ifadesi yer almadan sadece JOIN ifadesi kullanılırsa, SQL Server bunu Inner Join olarak yorumlar.

23) Cross join, birinci tabloda yer alan her bir kaydı ikinci tabloda yer alan her bir kayıt ile ilişkilendirerek satırlar türetmede kullanılır.

24) Union ifadesi ile birleştirilen iki resultset’ı aynı sıradaki sütunların adları farklı ise, geçerli sütun adı, ilk resultset’teki sütun adıdır.

25) Alt sonuçların varlığını kontrol etmeye yarayan IN,NOT IN,EXIST ve NOT EXIST yardımı ile de tek sütunluk sorgular kesişim ve fark işlemine tabi tutulabilir.Ancak birden fazla sütun olması durumunda bu deyimler bir işe yaramayacaktır.Bu tür durumlarda INTERSECT ve EXCEPT deyimlerinin kullanılması gerekir.

26) Bir sorguda, gruplamaya girmeden önce elenecek satırları WHERE cümleciği ile tanımlamak gerekir. Gruplama neticesinde türetilen satırlar üstünde filtreleme yapılacaksa, bu filtreleme işlemi için HAVİNG kullanılır.
komik sql
27) Bir View’i silip yeniden oluşturduğumuzda, üstündeki izin ve engellemeleri yeniden ayarlamak gerekir. Ancak bir View Alter komutu ile değiştirilirse, hakların yeniden verilmesine gerek yoktur.

28) Non-Clustered indekslerin performansları, Clustered indekslerin performanslarından daha düşüktür.

29) Ondalıklı değişken değerler için kullanılabilecek değişken tiplerinden MONEY, DECIMAL gibi değişken tiplerinin tercih edilmesi önerilir, FLOAT değişken tipi kesin değer döndermediği için kullanılması pek tercih edilmez.

30) Unicode değişken tipleri, gereksiz yer tutması sebebiyle çok gerekmediği durumlarda kullanılması pek tercih edilmez (nvarchar, nchar gibi).

31) TEXT değişken tipi 2gb’a kadar yazıları tutabilir, adres değerini tuttuğu için Update, Insert işlemleri yaptığımız zaman işlem yapmaz, onun için ayrı bir kod yazmak gerekir.

32) DDL (CREATE, ALTER, DROP) Objectle ilgili yaptığımız her işlem için kullanılır. (schema, function, stored procedure vs.)

33) DML (DELETE, INSERT, UPDATE, SELECT, TRUNCATE) Data ile ilgili yaptığımız her işlemdir.

sql command ekle
34) Yarattığımız Stored Procedure’ün değerini değiştirmek istediğimizde artık ALTER TABLE etmeliyiz, aksi taktirde Create ifadesi ile zaten oluşturduğumuz stored procedure’ü tekrar oluşturmaya çalıştığımız için hata alırız.

uniqure

 

35) Tablo üzerinde yapılacak her türlü fiziksel değişiklik ALTER TABLE ile yapılır.

36) SELECT TOP 0 * INTO komutu tablonun direkt kendisini yaratır; ama keyleri kaybederek yaratır.

37) Veri tabanında oluşturduğumuz bir tabloda üzerinde herhangi bir değişiklik yapıp sonra da kaydetmek istediğimizde, sonradan yapacağımız değişikliklere izin verilmez.

Bu durumu aşmak için,

Tools > Options > Prevent saving changes that require table re-creation checkbox’ında seçili olarak gelen işareti kaldırıp save edebiliriz.

 

1
38) Bir SP’nin bittiği yerde go deyimini kullanmak, sp’nizin bittiği yeri tam olarak belirtmenizi sağlayacağından istemediğiniz kodların sp ile birlikte derlenmesine ve istenmeyen hatalar meydana getirmesine engel olur.

Temel veritabanı nesneleri hakkında küçük hatırlatmalar:

ResultSet (Sonuç kümesi):

Bir seçme işlemi gerçekte veri tabanın da olmayan bir tablo döndürür. Bu tablo bazen 1 satır ve 1 sütundan oluşur.

Constraint (Kısıtlayıcı):

Herhangi bir alan için girilebilecek verileri zorlayıcı kurallara Kısıtlayıcı denir. Primary Key, Uniqe Key, Foreign Key gibi. Veritabanına kullanıcının keyfi değerler girmesi önlenmiş olur.

Indeksler:

Bir kaç yüz kayıttan oluşan bir tablo üstünde kayıt arama işlemi, VTYS için oldukça basit bir işlemdir ancak bu sayı milyonlara çıktığında doğru verilere erişmek için fazla zamana ihtiyaç duyulur. Bu nedenle verileri çeşitli özelliklerine göre organize edip sıralayacak ve bu sayede daha hızlı erişmemize olanak tanıyacak yapılara ihtiyaç duyarız. Indexler, kayıtları fiziksel olarak sıraya sokuyorsa CLUSTERED INDEKS, fiziksel olarak sıraya koymuyorsa NONCLUSTERED INDEKS adını alır.

Clustered INDEKS:

Verilerin kendisinin index key (indexin verileceği kolon) değerine göre fiziksel olarak alfabetik sıralandığı index türüdür. Clustered Index bir tabloda maksimum bir tane olabilir. (Örnegin telefon defterinde yapılan bir arama)

indeksler

Non-Clustered Index:

Non-Clustered Index mimarisinde fiziksel bir sıralama söz konusu değildir. Index değeri, Clustered Index’in aksine verinin kendisi değil pointer değeridir. Bu pointer değeri verinin nerede olduğunu gösterir. Non-clustered Index bir tabloda maksimum 999 tane olabilir.(Sql Server 2008 için) (Örneğin Kitap’ta sayfa numaralarına göre yapılan bir arama )

Schema yaratma:

Aynı isimde tablo, stored procedure gibi nesneleri farklı şemalar içerisinde yeniden tanımlayabilmek mümkündür.

View:

Bazen tabloları olduklarından farklı gösterecek filtrelere ihtiyaç duyarız. View’lar birden fazla tablodan daha kolay veri almak için kullanılır. Program içinde yazılan kod daha basit olur. Yine tablolardaki bazı sütunlar gizlenebilir. Oluşturulan View’e bu sütun koyulmayabilir. View’ler bir çeşit istatistik olarakta kullanılabilir.

vieww

View’ler sonuç itibari ile gerçek anlamdaki tablolar değildir. Bundan dolayı View’ler üstünde ekleme veya güncelleme yaparken çeşitli kısıtlamalar vardır. Aslında bize direk select sorgusunu getirir. Update, Insert, Truncate işlemleri yapamazsın. View oluşturulduğunda, yapılabilecek herhangi bir hata da geri alınabilir. Ancak her View den select çektiğinde db.de performans sorunu yaratabilir.

şeklinde gösterilir.

Stored Procedure:

Genellikle veritabanı uygulamalarında veri erişim katmanı olarak kodlanır. Dışardan parametre alabilirler ve dışarıya parametre resultset döndürebilirler.

1.Datalar üzerinde yapacağın işlemleri saklı yordamlarda saklayabilirsin . Her gece kendisinin çalışmasını istediğin kod parçalarını Strod procedure yazarak sağlayabilrsin.
2.Jop’larla çalışma sürelerini ayarlayabilirsiniz.
3.Stored’lerin execute edilmesi gerekir. Tekrardan select * from sp yazmanıza gerek yoktur, zaten içinde select cümleleri saklıdır.

Function:

0-1 ya da yes-no şeklinde değerler döndürür .İstenildiği takdir de Table ‘da döndürebilir. Parametre alabilir (@PersonID int) gibi .

Truncate ile Delete işlemleri arasındaki farklar

  • TRUNCATE komutu ile parçalı silme yapılamazken DELETE komutu ile WHERE clause kullanılarak parçalı silme yapılabilmektedir.
  • DELETE komutu ile yapılan kayıt silme işleminde her silinen kayıt Transaction Log da kayıt bazında loglanmaktadır. TRUNCATE de ise loglama işlemi kayıt bazında yapılmamaktadır. Bu yüzden TRUNCATE komutu DELETE komutuna oranla büyük tablolarda inanılmaz hızlıdır.

ek

  • Eğer silme yapılan tabloda identity column var ise,  TRUNCATE işleminden sonra bu kolon 1 den başlamakta, DELETE işleminden sonra ise kaldığı yerden devam etmektedir.
  • Foreign key içeren tablolarda TRUNCATE işlemi yapılamaz. Çünkü Foreign key’e bağlı olan kayıtlarında silinebilmesi için table’ın trigerlanması gerekmekte ama TRUNCATE işleminde daha öncede söylediğim gibi loglama işlemi gerçekleşmemektedir. Genede TRUNCATE kullanmak istiyorsanız önce Foreign key in kaldırılması sonra TRUNCATE in yapılması ve daha sonrada Foreign Key in tekrar tanımlanması gerekmektedir.
  • Foreign key içeren tablolar DELETE ile silinmek zorundadır ya da performanslı olmasını istiyorsanız işlemi DROP-CREATE şeklinde gerçekleştirebilirsiniz.

Primary Key oluşturma:

 

Foreign Key oluşturma:

  • Hareket tablolarından özet tablolara referans alır.
  • Kendisine baglı özet tabloların primerykeylerini tutar.
  • Foreign key hareket tablolarıdır,bunlar verilerin çok olduğu sürekli değişimin olduğu tablolardır. (Siparis Tablosu gibi)

Sonradan foreign key eklemek isterseniz yani tablo oluştuktan sonra,

Unique Key:

Bir alanı Unique yaptığınızda onu eşsiz yapmış olursunuz, mesela email alanını unique yaptığınızda ikinci kez aynı emaili eklemek istediğinizde veritabanı hata verecektir. Her eklenen email bir kez eklenebilir ve veritabanında böylelikle tektir.

Örneğin müşteri kodu P423423 şeklinde string bir ifadeniz olsun, siz bunun tekil (primary key )olmasını istiyorsananız, bu bir string olduğu için sorun yaratabilir, ama Unique key derseniz sıkıntı çıkmaz .
PR – Key’ide Unique gibidir bir alani eşsiz yapar ama farkı bir tabloda sadece bir tane primary key olmasıdır.
Null değerlerde alabilir. Örneğin müşteri tablosundaki TCKN gibi uzun bir alana primery key de koymak istemiyorsanız, o zaman UK yapabilrsiniz.

Sub Query:

Sub Query yani sorgu içinde sorgu, içteki sorgunun dışta olan sorguya değer üretmesidir. BO tarafında kullanımı daha fazladır .

2

Sub – Query’ler performas açısından gerekmediği durumlarda fazla tercih edilmezler, bunun yerine Temp Table kullanmak daha iyi olur .

 

Temp Table:

Geçici tablolar çalışma anında oluşturulur ayrıca normal bir tabloda yapabileceğimiz tüm işlemleri temp tablolarda da yapabiliriz. Temp Tablolar tempdb veritabanında saklanırlar.

Types of Temporary table

1) Local Temp Table

Local Temp tablolar sadece tabloyu oluşturan kullanıcının, oluşturmak için kullandığı connection üzerin de geçerlidir. Kullanıcı bağlantıyı kapattığı anda otomatik olarak silinir. Local Temp tablo tanımlamak için tablo isminin önüne # işareti koymamız yeterlidir.

2) Global Temp Table

Global olarak temp tablo tanımlamak için ## karakterlerini tablo isminden önce eklememiz yeterlidir. Global temp tablolar bir connection içinde tanımlandığı anda, normal tablolar gibi tüm kullanıcılar ve connectionlar içinde kullanılabilir hale gelirler. Global tabloyu oluşturduğunuz connection kapatılana kadar bu tablo var olmaya devam eder.

Local Temp Table örneği:

Temp Table oluşturmanın bir diğer yöntemi ise tek sefer kullanım hakkı olan Memory’de bir Table yaratmak.

 

Veri Ambarı Şemaları

1) Star SCHEMA

  • Bu şema yapısı en sık tercih edilen şema modelidir. Merkezde konumlandırılmış bir fact table ve onun etrafını sarmış dimension table’ların bir yıldız şeklini anımsatmasından dolayı da Star Scheme (Yıldız Şema) adını almıştır.
  • Bu şema yapısında fact table ‘a keylerle bağlanmış olan dimension tablelar demormalize edilmiştir.
  • Fact tablolarda, dimension tabloların primery keyleri ve sayısal değerler tutulur.
  • Her dimension tablodan fact tabloya bir bağlantı gelir.

3

2) Snowflake SCHEMA

  • Bu şema yapısındaysa; merkezde konumlandırılmış bir fact table ve onun etrafını sarmış dimension table’lara bağlanmış başka dimension table’ların kar tanelerine benzer bir şekil oluşturmasından dolayı Snowflake Schema denmiştir.
  • Bu şema yapısında fact table ‘a keylerle bağlanmış olan dimension tablelar normalizasyon kurallarına göre dizilmişlerdir, zaten dimensionlara bağlı başka dimensionlar olması da normalizasyon kurallarına uymak içindir.
  • Özet tablonun da bir özetini çıkarıyoruz. Buna da bir foreıgn key tanımlıyoruz .
  • Sorgu performansını artırır.

 

4

Normalizasyon nedir?

Verilerin düzenli olarak tutulmasını sağlayan kurallar topluluğudur. Çıkarabildiğimiz kadar farklı varyasyonlar için düzeltme temizleme yapılabilir. Data tekrarını önlemek, verilerin kapladğı alanları azaltır.

11

12

13

 

 

 

 

 

 

 

 

 

 

 

Performans karşılaştırmasını nasıl görebiliriz?

Performans karşılaştırması yapmak için Display Estimated Execution Plan butonuna tıkladıgımızda, cost’tan nerede ne kadar zaman harcadıgını görebiliriz.

Örneğin,

6

Merge komutunun kullanımı

Update, insert gibi komutları bir arada conditiona bağlı olarak yapıldığı, eşleşen kayıt varsa update et,  kayıt yoksa insert et işlemlerini yapmak için kullanırız.

Olan kaydı update edersin, source içinde yoksa insert edersin.

Örneğin,

     

Hadi bir de örneklere göz atalım!

1. Cursor kullanımı:

2. Tablo tipi parametre kullanım örneği:

3. Transaction örneği:

4. Veritabanı yetkinliklerini artırma – yedekleme ve yedekten döndürmek:

Aklınızdakileri hayata geçirebilmeniz dileğiyle, sevgilerle…

  • Selin Yaman

    Normalizasyon konusu tam olarak kafamda canlanmadı, biraz daha detaylı anlatabilir misiniz? Hep kafama takılan bir konu :)