28 Mayıs 2018 Pazartesi

Sql Server Tips 8-Cast ve Convert Arasındaki Farklar


Bu makalede, verileri bir türden diğerine dönüştürmek istediğimizde önemli bir farklılık olup olmadığını anlamak için CAST ve CONVERT işlevlerini inceleyeceğiz.

CAST ve CONVERT fonksiyonları çoğu durumda birbirinin yerine kullanılabilir olduğundan , birinin diğerinden daha iyi olup olmadığını merak ediyor olabilirsiniz.


CAST ve CONVERT Arasındaki Benzerlikler
Birçok yönden CAST ve CONVERT benzerdir. Her ikisi de verileri bir türden diğerine dönüştürmek için kullanılır. Sözdizimlerinin farklı olduğunu düşünürsek, her iki işlev de değerleri bir formasyondan diğerine dönüştürür.
İkisi arasında performans farkı yoktur

CAST ve CONVERT Arasındaki Farklar
ANSI-SQL belirtiminin bir parçasıdır; Oysa CONVERT değildir.

CONVERT en önemli farkı, biçimlendirme için kullanılan isteğe bağlı stil parametresini kabul etmesiyle yatmaktadır.
Aşağıdaki örnekte olduğu gibi, bir DateTime veri türünü Varchar'a dönüştürürken, YYYY/AA/GG veya AA/GG/YYYY gibi sonuç tarihlerini belirtebilirsiniz.

SELECT CONVERT(VARCHAR,GETDATE(),101) as MMDDYYYY,
       CONVERT(VARCHAR,GETDATE(),111) as YYYYMMDD

Aşağıdaki örnekte olduğu gibi, bir DateTime veri türünü Varchar'a dönüştürürken, YYYY/AA/GG veya AA/GG/YYYY gibi sonuç tarihlerini belirtebilirsiniz.

CAST veya CONVERT Hangisini Kullanmalıyım?
Dönüşüm esnasında özel bir formatlama ihtiyacı olmadıkça CAST kullanmaya devam etmeliyiz.
CAST Kullanımının performans açısından bir eksikliği yoktur.
CAST ANSI-SQL uyumlu olduğu için diğer veritabanlarında da kullanılmaya uygundur.

9 Mayıs 2018 Çarşamba

SQL Server Tips 7-SQL Server TABLE SCAN, INDEX SCAN VE INDEX SEEK Arasındaki Farklar


SQL Server'da datalar table üzerine kaydedilirken  tanımlama yapılmadığı sürece sıralı olarak diskte tutulmazlar. Bu tip tablelara Heap Table adı verilir. Heap Table üzerine yeni bir kayıt eklendiğinde rastgele data pageler üzerine yazılır. Heap table üzerinde herhangi bir kayıt arandığı zaman tüm dataya erişilip aranan kayıtla karşılaştırılır. Kayıt bulunsa bile başka kayıtlar bulunma ihtimali olduğu için table üzerindeki tüm kayıtlarla karşılaştırma işlemi yapılmak zorundadır.

Bu işleme TABLE SCAN işlemi denir. Çok yoğun dataların olduğu tablelarda bu arama işlemi çok maliyetli olacağı için kullanılmaz.

INDEX SCAN işleminde ise  tablo üzerinde index olmasına rağmen SQL Server kayıtlara TABLE SCANda olduğu gibi satır satır erişir.  SQL Serverın bu şekilde işlem yapmasının sebebi sorgu sonucunda çok fazla kayıt döndürüleceğine karar vermesinden dolayı  satır satır erişmenin daha karlı olacağına karar vermesinden dolayıdır.  Bu sebeble INDEX SCAN işlemi ile TABLE SCAN işlemi hemen hemen aynıdır.

INDEX SEEK işlemi ise veriye erişirken Clustered veya Non-clustered olan bir indexin kullanıldığını bu sayede sadece istenilen verilere eriştiğimizi göstermektedir. Bu nedenle Index Scan yerine Index Seek tercih edilir. Index Seek performans açısından en üst noktadır.

7 Mayıs 2018 Pazartesi

SQL Server Tips 6-UNION ve UNION ALL arasındaki fark nedir


Bazen birden çok tablodan veya viewden veriyi tek bir kapsamlı veri kümesine birleştirmeye ihtiyaç vardır. Bunlar aynı veritabanındaki benzer tablolar olabildiği gibi farklı veritabanlarındaki veya farklı serverlarda bulunan veritabanlarındaki tablolar arasında olabilir.

Biz burada UNION ve UNION ALL nasıl kullandığına ve arasındaki farklara bakacağız.

Temel olarak iki komutta birden çok veri kümesini bir veri kümesinde birleştirmeye yarasada aralarında bir fark vardır.

UNION komutunda iki tablonun benzer satırları birleştirilir. Satırlarda DISTINCT işlemi uygulanır. Yinelenen satırlar getirilmez.

UNION ALL komutunda ise yinelenen satırlar kaldırılmaz.  Yinelenen satırlar kaldırılmadığı için işlem hızlıdır.

  • Her sorguda aynı sayıda sütun bulunmalıdır.
  • Her sütun, uyumlu veri türlerine sahip olmalıdır.
  • Son sonuç kümesinin sütun adları ilk sorgudan alınır.
  • ORDER BY ve  COMPUTE cümleleri sadece her bir sonuç kümesinde değil, genel sonuç kümesi için yayınlanabilir.
  • GROUP BY ve HAVING cümleleri sadece her bir sonuç kümesi için verilebilir ve genel sonuç kümesi için geçerli değildir.

2 Mayıs 2018 Çarşamba

SQL Server Tips 5-SQL Sequence ile Identity Column Arasındaki Farklar


Bugünkü yazımda  sizlere SEQUENCE ile IDENTITY COLUMN arasındaki farklılıkları anlatmak istiyorum. Bircoğumuz SSMS açınca içinde SEQUENCE objesinin farkında değilizdir. Oracle uzun zamandan buyana var olan bu obje SQL Server 2012 ile hayatımıza girmiştir.

 SEQUENCE tanımlanan değerler arasında numeric ve sıralı  artan veya azalan sayılar üretilir. Bir SEQUENCE birden fazla tablo için birbirini takip eden sayılar üretilebilir.

CREATE SEQUENCE MySEQUENCE
    START WITH 1
    INCREMENT BY 1 ;
GO

SEQUENCE Kullanımı
SELECT NEXT VALUE FOR MySequence

IDENTITY Sütunlar ise otomatik artan sütunlardır.  SQL Serverda bir alana IDENTITY olarak özellik tanımladığımızda, ilgili tabloya herhangi bir satır eklediğimizde bu IDENTITY özelliği tanımlanmış sütun değeri otomatik olarak artacaktır.  IDENTITY SEED başlangıç miktarı , IDENTITY INCREMENT ise artış miktarıdır.

CREATE TABLE MyIndentity
(

 NameID int IDENTITY(1,1),
 FirstName varchar (25),
 MiddleInt char(1),
 LastName varchar(40)
);

INSERT MyIndentity
(FirstName, MiddleInt, LastName)
VALUES
('Joe', 'K', 'Smith');

INSERT MyIndentity
(FirstName, MiddleInt, LastName)
VALUES
('Jane', 'L', 'Doe');

SELECT * FROM MyIdentity

Nitelik
Sequence
Identity
Object Seviyesi
Database
Table
Limit
Limit Belirlenebilir
INT ve BIG INT Data Tipinde Limitlidir
Values
Uygulamalar NEXT VALUE FOR ile çağrılabilir
Bir tabloya INSERT olduğunda oluşur.
Miktar
Kurulumda INCREMENT olarak beyan edildi ve herhangi bir şey olabilir. Artan sayıların yerine dizinin alçalmasına neden olacak negatif bir sayı olabilir.
Kurulumda INCREMENT olarak beyan edildi ve herhangi bir pozitif sayı olabilir, sayılar yükselir
Kapsam
BirTransaction kapsamı dışında oluşturuldu
Bir Transaction Oluşturuldu
Numara Atama
Sıralar önceden tahsis edilebilir (örnek bana 1-25 atar)
Önceden ayrılamaz.
Boşluklar
Boşluklar Verilebilir
Boşluklar Verilebilir
Benzersizlik
Numaralar Sıfırlanıp yeniden kullanılabilir
Benzersizdir. Primary Key olarak kullanılabilir.

26 Nisan 2018 Perşembe

SQL Server Tips 4-Primary key, Unique key ve Foreign Key Arasındaki Farklar


Bugünkü yazımda sizlere PRIMARY KEY, UNIQUE KEY ve FOREIGN KEY arasındaki farkları anlatmak istiyorum.   Biz Developerların en çok araştırdıkları konulardan birisi bu üçü arasındaki farklardır.

PRIMARY KEY ve UNIQUE KEY birbirlerine benzerler ve tanımlandıkları sütununda benzersizlik sağlarlar.

PRIMARY KEY
  • PRIMARY KEY bir NULL değer alamaz
  • Bir tabloda sadece bir tane PRIMARY KEY olabilir.
  • Default olarak PRIMARY KEY bir Cluster Indextir. Datalar tableda Cluster Indexe sıralanmış durumdadır.
  • PRIMARY KEY diğer tablolardaki alanlarla FOREING KEY olarak ilişkilendirilebilir.
  • PRIMARY KEY temporary table  ve table variable içinde kullanabiliriz.
  • PRIMARY KEY  kolonunda otomatik artan identity set edilebilir.
  • PRIMARY KEY  diğer bir tablo ile FOREIGN KEY olarak ilişkilendirilmişse silinemez. Öncelikle
FOREIGN KEY olan tablodan silmemiz gerekir.


UNIQUE KEY
  • UNIQUE KEY bir defa olmak üzere NULL değeri alabilir.
  • Bir tabloda birden fazla UNIQUE KEY olabilir.
  • Default olarak  UNIQUE KEY unique non-clustered indextir.
  • UNIQUE KEY diğer tablolardaki alanlarla FOREING KEY olarak ilişkilendirilemez

FOREIGN KEY
  • FOREIGN KEY başka bir tablodaki    PRIMARY KEY alandır.
  • Birden fazla NULL değer kabul edebilir.
  • FOREIGN KEY otomatik olarak clustered or non-clustered index oluşturmaz. Manuel oluşturmamız gerekir.
  • Bir tabloda birden fazla FOREIGN KEY  olabilir.
  • Temporary table  veya table variable FOREIGN KEY barındıramaz.

23 Nisan 2018 Pazartesi

SQL Server Tips 3-DateTime ve DateTime2 Arasındaki Farklar


DateTime2 veri tipi SQL Server 2008 ile birlikte hayatımıza girmiştir. Aşağıdaki tabloda DateTime ile DateTime2 arasındaki farkı özetlemektedir.



DateTime
DateTime2[(n)]
Min Değer
1753-01-01 00:00:00
0001-01-01 00:00:00
Max Değer
9999-12-31 23:59:59.997
9999-12-31 23:59:59.9999999
Data Boyutu
8 Bytes
6 to 8 bytes
Not:Parametre N isteğe bağlıdır. Belirtilmemişse kesirli saniye hassasiyeti 7 haneli olabilir. Kesirli saniye için hassasiyet <3'den 6 bayt,  3 veya 4 için kesirli saniye için hassasiyet  7 bayt 4den büyükse 8 bayt alır

Kullanımı
Declare @now datetime
Declare @now datetime2(7)
Uyumluluk
ANSI/ISO uyumlu değildir.
ANSI/ISO uyumludurç.
Şimdiki Tarih ve Saati Getiren Fonksiyon
GetDate()
Örnek: SELECT GETDATE()
Sonu.: 2011-09-16 13:23:18.767
SYSDATETIME()
Örnek:SELECT SYSDATETIME()
Sonuç: 2011-09-16 13:23:18.7676720
+/- days
DECLARE @nowDateTime DATETIME = GETDATE() SELECT@nowDateTime + 1
Sonuç: 2011-09-17 13:44:31.247
DECLARE @nowDateTime2 DATETIME2=SYSDATETIME()SELECT @nowDateTime2+1
Sonuç: Msg 206, Level 16, State 2, Line 2
Operand type clash: datetime2 is incompatible with int


22 Nisan 2018 Pazar

SQL Server Tips 2- CHAR, NCHAR, VARCHAR ve NVARCHAR arasındaki farklar


CHAR, NCHAR, VARCHAR ve NVARCHAR  data tiplerinin hepsi text veya string verilerini saklamak için kullanılır. Ancak aralarında bazı farklar vardır.

CHAR Veri Tipi: Sabit uzunlukluklu unicode olmayan data tiplerini saklamak için kullanılır. CHAR(n) şeklinde kullanımı vardır. 1 ile 8000 arasında değer alabilir.  İçine girilen değer ne olursa olsun tanımlandığı kadar alanı kaplar.

VARCHAR Veri Tipi: Değişken uzunluklu unicode olmayan data tiplerini saklamak için kullanılır. İçine girilen değer kadar alanı kaplar.   1 ile 8000 arasında değer alabilir.   Sabit uzunluklu alanlar için CHAR veri tipini değişken uzunluklu alanlar için VARCHAR veri tipini kullanmamız doğru olacaktır.

NCHAR Veri Tipi:CHAR veri tipinin unicode data tiplerini saklamak için kullanılır.   1 ile 4000 arasında değer alabilir. 

NVARCHAR Veri Tipi :VARCHAR veri tipinin unicode data tiplerini saklamak için kullanılır.   1 ile 4000 arasında değer alabilir.  Hem NCHAR hemde NVARCHAR veri tipleri N olmayanlara göre iki kat fazla alan kapladığı için sadece Unicode ifadeler için kullanılmalıdır.

SQL Server Tips 1-Stored Procedure ile Function Arasındaki Farklar


SQL Server konusunda kısa kısa ipuçları vereceğim bu yazı dizimde ilk olarak Stored Procedure ile Function arasındaki farklardan bahsetmek istiyorum.  Siz değerli bilişimci arkadaşlar elbette ikisi arasındaki farkları merak ediyorsunuzdur.  Bu yazımda kısaca ikisi arasındaki ortak noktalardan ve farklardan bahsedeceğim.

İkisi arasındaki ortak özelliklerden bahsedecek olursak
Her ikiside bir veritabanında saklanır. Yani içinde bulunan T-SQL ifadeler ağ üzerinden gönderilmez. Buda ağ trafiğini aşağıya düşürür. Her ikiside yanlızca bir kez derlenir. İlk kez çalıştığında execution plan cache belleğe alınır. Tekrar tekrar çağrıldığında performansı büyük ölçüde artar.

Aralarındaki Farklara  Gelecek olursak

Basit Farklar

  • Function mutlaka bir değer döndürmesi gerekirken Stored Procedurde bu isteğe bağlıdır. (Stored Procedur 0 veya n değerlerini döndürebilir.)
  • Functionlar sadece input parametrelerine sahip olabilirken stored procudrler input/output parametrelerine sahip olabilir.
  • Functionlar stored prosedürden çağrılabilirken stored prosedürler function üzerinden çağıralamazlar.
  • Functionlar SELECT deyimi ile çağrılabilir. Stored Prodesedürleri çalıştırmak için Execute/Exec komutu kullanılmalıdır.

Gelişmiş Farklar
  • Prosedür, SELECT'in yanı sıra DML (INSERT / UPDATE / DELETE) ifadesine izin verirken, Fonksiyon sadece SELECT ifadesine izin verir.
  • Procedur bir SELECT deyiminde  kullanılamazken, Function bir SELECT ifadesinde kullanılabilir.
  • Stored Prosedürler WHERE/HAVING/SELECT bölümünün herhangi bir yerinde kullanılamazken Functionlar kullanılabilir.
  • TRY-CATCH bloğu bir stored prosedürde kullanılabilirken, TRY-CATCH bir functionda kullanılamaz.
  • Stored Prosedüre Transaction yapısı ile kullanılabilirken Function Transaction yapısını desteklemez.

14 Nisan 2018 Cumartesi

SET STATISTICS IO (Transact-SQL) Kullanımı

Bu komut TSQL sorguları tarafından oluşturulan disk ve bellek etkinliği miktarıyla ilgili bilgileri görüntülememizi sağlar.

SET STATISTICS IO ON;olduğunda istatistiksel bilgiler görüntülenir. Bu seçenek açık olduktan sonra aşağıdaki komut kullanılana kadar tüm istatistiksel bilgiler görüntülenir. 
SET STATISTICS IO OFFolduğunda istatistiksel bilgiler kapatılır.

Aşağıdaki örnekte SQL uygulanırken kaç tane mantıksalve fiziksel okuma olduğu gösterilmektedir.


USE [AdventureWorks2016CTP3]
GO        
SET STATISTICS IO ON; 
GO 
SELECT *  
FROM Production.ProductCostHistory 
WHERE StandardCost < 500.00; 
GO 
SET STATISTICS IO OFF; 


(269 rows affected)
Table 'ProductCostHistory'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row affected)

Sql Server DateTime Veri Tipindeki Datayı Türkçe Formatında Göstermek

  SQL'de tarihleri farklı formatlarda göstermek için FORMAT fonksiyonunu kullanabilirsiniz. Türkçe kısa tarih formatı genellikle "...