Sepetiniz

Tablo Oluştururken Aynı Script İçersinde Index Oluşturmak(Inline Specification of Index)

SQL Server 2014 öncesinde SSMS üzerinde sağ tıklayarak new index yöntemi ile ya da tsql script’i ile iki şekilde index tanımlayabiliyorduk. Fakat tablo tanımlarken primary key ya da foreign key’i tanımladığımız gibi index’i de tanımlayamıyorduk. SQL Server 2014 ile beraber artık tabloyu oluşturuken index’i de oluşturabiliyoruz. Aşağıdaki script’te nasıl oluşturduğumuzu görebilirsiniz.

 

CREATE TABLE InlineIndex (
AD VARCHAR (25) NULL,
SOYAD VARCHAR (25) NULL,
MAAS BIGINT,
INDEX IX_MAAS NONCLUSTERED (MAAS))

 

UPDATE STATISTICS Nedir

Bu makalede istatistik, tablo ya da veritabanı bazında istatistiklerinizi UPDATE STATISTICS komutuyla nasıl güncelleyebileceğimizi anlatacağım. Bu makaleden önce “SQL Server’da İstatistik Kavramı ve Performansa Etkisi” isimli makaleyi okumanızı öneririm.

 

 

Aşağıdaki script yardımıyla HumanResources şemasındaki Department tablosunda bulunan AK_Department_Name isimli index’e ait istatistiği güncelleyelebilirsiniz.

USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department] [AK_Department_Name] 
GO 

 

 

Aşağıdaki script yardımıyla HumonResource şemasındaki Department tablosundaki tüm istatistikleri güncelleyebilirsiniz.

USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department]
GO 

 

Aşağıdaki script yardımıyla da veritabanındaki tüm istatistikleri güncelleyebilirsiniz.

USE AdventureWorks2014Yeni
GO 
EXEC sp_updatestats

 

İstatistikleri güncellerken aşağıdaki 3 seçenekle güncelleme yöntemini belirleyebilirsiniz.

 

  1. FULLSCAN
  2. SAMPLE
  3. RESAMPLE

 

FULLSCAN: Bu yöntemde istatistiğin bağlı olduğu tablo ya da indexed view’deki tüm satırları tarayarak istatistiği günceller. Bir istatistiği update etmek için aşağıdaki şekilde çalıştırabilirsiniz.

 

USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department] [AK_Department_Name]  WITH FULLSCAN
GO 

 

SAMPLE: SAMPLE ifadesinden sonra belirttiğiniz satır sayısı ya da yüzde kadar satırı örnek alarak istatistiği günceller. Bir istatistiği update etmek için aşağıdaki şekillerde çalıştırabilirsiniz.

 

 

--tablodaki satır sayısı 16 iken ben 10 satırı örnek alarak bu istatistiği güncellemesini istedim.
--tablodaki satır sayısını Select Count(*) FROM [HumanResources].[Department] ile ya da
--sp_spaceused '[HumanResources].[Department]' sonucunda gelen rows kısmından öğrenebilirsiniz.
USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department] [AK_Department_Name]  WITH SAMPLE 10 rows
GO

 

--Aşağıdaki script ile de istatistiğin bağlı olduğu tablo ya da indexed view'deki
--satır sayısının %50'sini örnek alarak istatistiği güncelliyor.
USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department] [AK_Department_Name]  WITH SAMPLE 50 PERCENT
GO 

 

RESAMPLE: İstatistiği en son örnek alınan oranı baz alarak günceller. Fakat önceki sefer WITH FULLSCAN ile güncellediyseniz RESAMPLE ile çalıştırdığınızda istatistiği FULLSCAN ile güncelleyecektir.

 

Ben bu parametreyi çok tavsiye etmiyorum. Çünkü geçmişte sorun çözmek için bir istatistiği WITH FULLSCAN ile güncellemiş olabilirsiniz. Normal bakım job’larını kullanarak RESAMPLE ile istatistikleri güncellediğinizde bu istatistik sürekli olarak WITH FULLSCAN ile güncellenecek ve gereksiz yere istatistik güncelleme job’ını uzatacaktır.

 

Aşağıdaki şekilde çalıştırabilirsiniz.

 

USE AdventureWorks2014Yeni
GO 
UPDATE STATISTICS [HumanResources].[Department] [AK_Department_Name]  WITH RESAMPLE
GO 

 

 

Veritabanı bazında da aşağıdaki şekilde tüm istatistikleri RESAMPLE parametresiyle güncelleyebilirsiniz.

 

EXEC sp_updatestats RESAMPLE

 

NOT: Benim tavsiyem bir problem olmadığı sürece istatistikleri herhangi bir parametre vermeden default olarak güncellemenizdir. Çünkü SQL Server Query Optimizer, en iyi query plan’ı oluşturmak için örneklenmesi gereken satır sayısını kendi belirler.

 

Bir istatistik hakkında detaylı bilgi almak için DBCC SHOW STATISTICS komutunu çalıştırabilirsiniz. “DBCC SHOW_STATISTICS Nedir ve Nasıl Kullanılır” isimli makalede detayları bulabilirsiniz.

DBCC SHOW_STATISTICS Nedir ve Nasıl Kullanılır

DBCC SHOW_STATISTICS ile bir istatistik hakkında detaylı bir bilgi alabiliriz. Çoğunuzun bildiği gibi istatistikler query plan oluşturulurken sql server engine’in karar vermesindeki en önemli rollerden birine sahiptir. SQL Server Engine istatistiklere bakılarak bir index’in kullanılıp kullanılmayacağına ya da ne şekilde kullanılacağına karar verir. Bu yüzden herşeyden önce istatistiklerimizin güncel olması gerekir.

 

Bu makaleyi okumadan önce bu komuta neden ihtiyacınız olduğunu daha iyi anlamak için aşağıdaki makaleleri okumanızı tavsiye ederim.

 

SQL Server’da İstatistik Kavramı ve Performansa Etkisi“,

SQL Server’da Index Kavramı ve Performansa Etkisi“,

Execution Plan Nedir

 

DBCC SHOW_STATISTICS bir tablo’daki veya indexed view’deki bir istatistik hakkında detaylı bilgileri gösterir.

 

Bu komutun çıktısı 3 öğeden oluşur.

 

  • Statistic Header
  • Density Vector
  • Histogram

 

Bir örnek üzerinden yukardaki kavramları ve detaylarını açıklayalım. AdventureWorks veritabanında aşağıdaki komutu çalıştırın.

 

Bu komutta,

 

HumanReources şema adını,

 

Department tablo adını,

 

AK_Department_Name’de istatistik adını belirtiyor.

 

 

DBCC SHOW_STATISTICS([HumanResources.Department],[AK_Department_Name])

 

 

Karşımıza aşağıdaki gibi bir sonuç kümesi çıkıyor.

 

 

Aşağıdaki tablolarda sonuç kümesinde gelen kolonların açıklamalarını görebilirsiniz.

Statistic Header

 

Name

İstatistik ismi

Updated

İstatistiğin son update edildiği tarih

Rows

İstatistik son update edildiğinde bağlı olduğu tablo ya da indexed view üzerindeki satır sayısını gösterir.

Rows Sampled

İstatistiği oluştururken ya da güncellerken örnek alınan satır sayısıdır. “UPDATE STATISTICS Nedir” isimli makalede daha detaylı bilgi bulabilirsiniz.

Step

Histogram’daki step sayısını belirtir. Histogram kısmında değineceğiz.

Density

SQL Server 2008’den sonraki sürümlerden sonra kullanılmamıştır.

Average Key Length

İstatistiği oluşturan kolonların byte cinsinden ortalama büyüklük değeri

String Index

Eğer istatistiği oluşturan kolonlar char, varchar, nchar, nvarchar, varchar(max), nvarchar(max), text, veya ntext kolonlarından biriyse bu kolon YES değerini alır.

Filter Expression

Eğer istatistik filtrelenmişse filtre ifadesini gösterir.

Unfiltered Rows

Filtrelenmemiş satır sayısını gösterir. Eğer filtre yoksa istatistiğin bağlı olduğu tablo ya da indexed view’deki satır sayısını verecektir.

 

 

Density Vector

 

All Density

1/n değerini ifade eder. Buradaki en tablodaki birbirinden farklı kayıt sayısıdır. Bu satır 0’a ne kadar yakında tekillik o kadar sağlanmış demektir.

Average Length

İstatistiği oluşturan kolonların byte cinsinden ortalama büyüklük değeri

Columns

Bir önceki iki kolondaki All Density ve Average Length’in hangi kolonlar için hesaplandığını gösterir.

 

 

Histogram

Veri dağılımını gösteren grafik. SQL Server bir istatistiği oluştururken öncelikle kolon değerlerini sıralar. Sonrasında  verileri belirli gruplara ayırır ve her grubun üst sınırını belirler. Örneğin 1’den 1000’e kadar değeri olan bir kolon olduğunu düşünün. Bu kolonda istatistik oluşurken veriler gruplandı ve 100’e bölündü.  Bu 100 parça’nında 1’den 10’a kadar, 10’dan 20’ye kadar şeklinde ayrıldığını varsayalım. Burada 1’den 10’a kadar olan kısım 1 step olarak geçer. 100’e bölündüğü içinde bu istatistiğin histogramında 100 step var demektir.

RANGE_HI_KEY

Histogram step’i için üst sınırı belirten key değeri. Yani verilerin dağılımında her step’i birbirinden ayıran bir çizgi.

RANGE ROWS

Bir histogram adımı(step) başına düşen tahmini satır sayısı

EQ_ROWS

Bir üst sınır’a eşit olan kayıt sayısı

DISTINCT_RANGE_ROWS

Bir histogram adımı(step) başına düşen tahmini duplike olmayan satır sayısı

AVG_RANGE_ROWS

İlgili stepteki(histogramdaki satır) duplike kayıt sayısı

 

Sorgu Sonucunda Gelen Kayıtları Limitlemek ve Sayfalamak(OFFSET ve FETCH SQL Server Paging)

İstemci(Client)’ye sorgu sonucunun tamamını göndermek istemiyorsanız OFFSET ve FETCH yardımıyla sorgu sonucunun hangi satırından başlayıp kaç tane satırını döndüreceğini belirleyebilirsiniz.

 

Bir örnek yaparak çok daha kolay anlaşılabileceğini düşünüyorum. Aşağıdaki kod bloğunu inceleyelim.

 

İlk sorguda AdventureWorks2014Yeni veritabanındaki tüm kolanları City’ye göre sıralayarak select ediyoruz.

 

İkinci sorguda aynı sorgunun ilk 5 kaydı haricindeki diğer tüm kayıtları getiriyoruz.

 

Üçüncü sorguda da ilk kayıttan başlayarak yalnızca 10 kaydı getiriyoruz. Sorgu sonucunun her seferinde aynı gelmesi için sorgunun sonuna OPTION(MAXDOP 1) hint’ini koyuyoruz. Eğer koymazsak ve sorguda parallelism olursa sıralama her seferinde farklı olabiliyor.

 

SELECT *  FROM [AdventureWorks2014Yeni].[dbo].[Address]
Order By City ASC
OPTION(MAXDOP 1)

 

SELECT *  FROM [AdventureWorks2014Yeni].[dbo].[Address]
Order By City ASC
OFFSET 5 ROWS
OPTION(MAXDOP 1);

 

 

SELECT *  FROM [AdventureWorks2014Yeni].[dbo].[Address]
Order By City ASC 
OFFSET 40 ROWS
FETCH NEXT 10 ROWS ONLY
OPTION(MAXDOP 1);

 

 

Kod içinde bir düzenlemeyle sayfalama yapmak için bu özellik kullanılabiliyor. Mesela aşağıdaki kod’da sayfa başına satır sayısı 10 iken 5.sayfayı getiriyoruz.

DECLARE @SayfaBasinaSatir INT = 10, @SayfaNumarasi INT = 5

SELECT *  FROM [AdventureWorks2014Yeni].[dbo].[Address]
Order By City ASC 
OFFSET @SayfaBasinaSatir * (@SayfaNumarasi-1) ROWS
FETCH NEXT @SayfaBasinaSatir ROWS ONLY
OPTION(MAXDOP 1);

 

 

Used Defined Function(udf) Nedir?

User Defined Function bir programlama dilindeki gibi parametre alan ve bir sonuç ya da sonuç kümesi döndüren bir özelliktir.

 

User Defined Function’lar ile,

 

  • Stored procedure’ler gibi compilation maliyetini yok ederek daha hızlı sonuç üretebilirsiniz.
  • Modüler programlamaya olanak sağlar. İstediğiniz bir function’ı oluşturup daha sonra kodunuzda istediğiniz yerden istediğiniz sayıda çağırabilirsiniz.

 

User Defined Function’ın birkaç çeşidi vardır:

 

Scalar Function: Return ifadesinde text, ntext, image, cursor, ve timestamp veri tipleri haricindeki belirtilen tek bir değeri döndürür.

 

Aşağıda örnek kullanımını görebilirsiniz.

CREATE FUNCTION ReverseCustName(@string varchar(100))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @custName varchar(100)
    RETURN @custName
END

 

Table-Valued Functions: Return ifadesinki sonuç kümesi table veri tipinde döndürür. “User Defined Table Type ve Table Valued Parameter” isimli makaleyi okumak isteyebilirsiniz.

 

Aşağıda örnek kullanımını görebilirsiniz.

CREATE FUNCTION ProductsCostingMoreThan(@cost money)
RETURNS TABLE
AS
RETURN
    SELECT ProductID, UnitPrice
    FROM Products
    WHERE UnitPrice > @cost