Yazar arşivleri: Ahmet Kaymaz

dm_io_virtual_file_stats DMV

SQL Server 2005 ile birlikte gelen DMVler (Dynamic Management Views, Dinamik Yönetim Görüntüleri), SQL Server’in iç dünyasında olup bitenler hakkında önemli bilgiler sunan nesneler kütüphanesidir. Sistem tablolarından beslenen bu nesneler bazen sistemle ilgili anlık bilgiler bazen de geçmiş bilgiler sunar. Bunlarcan onlarca bulunduğu için hepsini bilmek mümkün değil ancak I/O, memory tabanlı performans verileri veya kullanıcı / oturumla ilgili tarihçeye erişmek için kullanacaklarımızı elimizin altında bulundurmamız faydalı olacaktır. Bu sitede yeri geldikçe en çok kullanılanları paylaşmaya çalışacağız.
Okumaya devam et

SQL İlk ve Son Kayıtlar

Daha önce yazdığım SQL MAX MIN SUM İçin Farklı Alternatifler makaleye benzer olarak. Günlük raporlamada kolaylık sağlayacak bir ipucunu paylaşalım. Şu ana kadarki yazılarda en büyük, en küçük, ortanca, her gruptan n kayıt, rastgele seçim gibi ipuçlarını paylaştık. Bu yazı da herhangi bir grubun ilk ve son kayıtlarının kolayca nasıl bulacağımızı yazacağız. Bu amaç için Oracle cephesinde FIRST ve LAST isimli analitik fonksiyonlar bulunmaktadır. SQL Server 2005 ve sonrasında sunulan DENSE_RANK() fonksiyonu aracılığıyla bunları kolayca seçebiliriz. Bu fonksiyonu kullanarak her grubu içindeki 2. alana göre artan veya azalan sıralayacağız. Artan sıraladığımızda en son kayıtlar, azalan sıraladığımızda ilk kayıtlar “1¨ olarak numaralandırılacaktır.
Okumaya devam et

Index’lerin Aktif/Pasif (Enabled/Disable) Yapılması

SQL Server 2000’de mevcut bir indexi aktif veya pasif yapamıyoruz. Sadece drop edebiliriz. Oysa bazı durumlarda örneğin optimizasyon işlemlerinde veya büyük aktarımlar için (DTS, BCP, BULK INSERT ) kısıtlı zamanlarda geçici olarak bazı indexleri pasif yapma ihtiyacı doğabiliyor. SQL Server 2005 ve sonrasında gelen ALTER INDEX komutu sayesinde bu işlem yapılabilmektedir. Okumaya devam et

SQL Satır Payı, Satır Yüzdesi

Raporlama amaçlı kullandığımız sistemler üzerinde en çok Ara Toplam (Sub Total) ve Alt Toplam (Grand Total) satırlarına ihtiyaç duyarız. Bunlarla birlikte özellikle karşılaştırmanın sözkonusu olduğu için verilerde özetlenmiş satırın tüm toplam içerisindeki payına yanı o satırın yüzdesine de (Percent To Total) ihtiyaç duyabiliriz. Bunun için SQL’de subquery yöntemi kullanılır veya SQL Server 2005 ile birlikte gelmiş olan OVER() fonksiyonu tercih edilir.
Okumaya devam et

SQL Örneklem ve Rastgele Kayıt Seçimi

T-SQL’de bir tablodan rastgele kayıt seçmenin farklı yöntemleri bulunmaktadır. Bunlardan en popüler olanı NEWID() isimli sistem fonksiyonun kullanılmasıdır. Bu fonksiyon her çağrıldığında uniqueidentifier türünde tekil bir değer döndürür. Okuduğumuz tabloda her satır için bunu çağırıp listeyip bu alana göre sıralamamız yeterli olacaktır.
Okumaya devam et

EXEC ve sp_executesql Hangisi ?

Doğrudan SQL komutu çalıştırmak yerine bazı durumlarda dinamik SQL scriptleri çalıştırmak zorunda kalabiliyoruz. Özellikle stored procedure’ler içerisinde değişkenler kullanılarak oluşturulmuş script’leri çalıştırmak için EXEC komutu veya sp_executesql prosedürü kullanılır. Peki bunlardan hangisini ne zaman tercih etmeliyiz. Normal şartlar altında bir SQL cümlesini doğrudan çalıştırdığımız SQL Server, bellekten ilgili yürütme planını okuyup ona göre sorguyu çalıştırır. Böylece daha önceki deneyimleri doğrultusunda en uygun okumayı tercih etmiş olur. Fakat dinamik cümleleri çalıştırırken execution plan kullanılmaz her çalıştırmada yeni bir execution plan oluşturulur. Bu iki komutun en önemli farkı sp_executesql, parametrik olabilirken EXEC / EXECUTE parametrik değildir. Buradaki parametreden kastımız bu komutlara parametre olarak verilmiş sorgunun parametrik olmasıdır. Asıl önemli olan konu performans açısından sunucu aynı execution plan’ı kullandığı için daha sp_executesql yordamı daha iyi sonuç vermektedir. Çünkü bu yordamın mantığı sorgunun aynı olduğu sadece parametrenin farklı çalıştırılıyor olmasıdır. Aşağıdaki örnekte küçük bir tablodan bu 2 yordam aracılığıyla okuma yapılmış olup execution plan durumları listelenmiştir. Sistemdeki mevcut execution plan’ları temizlemek için DBCC FREEPROCCACHE kullanılır.
Okumaya devam et

SQL Script Dosyalarını Toplu Çalıştırma (OSQL – SQLCMD)

İçerisinde SQL Script’lerin bulunduğu metin dosyalarını komut satırında çalıştırmak için en iyi yöntem OSQL veya SQLCMD programcıklarını kullanmaktır (SQL Server Command Line Tool). Bilindiğim gibi bu araçlar Command Prompt’tan SQL Sunucusuna erişmeyi sağlayıp sorgu çalıştırmamıza imkan tanır. OSQL aracı SQL 2000’den beri kullanılmakta. SQL Server 2005 ile birlikte SqlCmd aracı sunuldu. Aşağıdaki ekranda bu komutların parametreleri görülmektedir.
Okumaya devam et

Linked Server Join Sorgu Performansı

SQL Server üzerinde tanımladığımız Linked Server yapıları uzak sunucuya manual bağlanmadan kolayca sorgular çalıştırmamıza imkan tanır. Linked Server aynı zamanda yerel bir kaynak ile uzak sunucudaki bir kaynağı çağraz sorgulamamızı da (Join) destekler.

SELECT a.*, b.* FROM T1 a
	INNER JOIN ABC.Aliveris.dbo.T2 b
         ON a.SatirKodu1 = b.SatirKodu2

Bu sorgu yereldeki T1 ile ABC isimli uzak sunucu üzerindeki T2 tablosunu Join edip iki taraftaki kolonları listeleyecektir. Fakat bu özelliği kullanırken performans sorunu yaşayabiliriz. Çünkü SQL Server JOIN işlemini yapmadan önce uzak sunucudaki T2 tablosunu kendi tarafına alacak ardından ana sorguyu çalıştıracaktır. Eğer karşı tablo küçük ve bağlantı hızlı ise çok sorun olmayacaktır. Ancak T2 tablosu büyükse veya ağ bağlantısı düşükse performans sorunu yaşayabiliriz. Bu yüzden yerel sunucu ile uzak sunucuyu doğrudan JOIN etmek yerine uzak sunucudaki verileri kendi tarafımıza geçici veya kalıcı bir tabloya aktardıktan sonra JOIN etmemiz daha doğru olacaktır. Hatta tüm tabloyu değil de filtre vererek çekmemiz sadece ihtiyaç duyulan verilerin taşınmasını sağlayacaktır.
Ayrıca uzak sunucu sorgularında Distributed Query yöntemi yerine OpenQuery yönteminin kullanılması her zaman daha hızlı olacaktır. Distributed Query yöntemi, klasik linked server yazım biçimini temsil eder. Yani sorguların SELECT * FROM UzakSunucu.UzakVeriTabani.Şema.TabloAdi şeklinde çalıştırılmasıdır. Bu durumda yerel Query optimizer yol haritasını kendisi belirleyecektir. OpenQuery ise sözkonusu sorgunun yorumlanmadan doğrudan uzak sunucu üzerinde çalıştırılmasını sağlayan bir fonksiyondur. Bu yöntemde tüm yükü uzak sunucu üstlenmiş oluyor.
Konuyla ilgili detayları SQL Server Linked Server (Bağlı Sunucu)
makalemde bulabilirsiniz.

SQL Server 2008 GROUP BY GROUPING SETS GROUPING_ID ROLLUP CUBE

SQL Server eski sürümlerinden beri GROUP BY ile veri özetlemesini destekler ayrıca ara ve alt toplamlar için WITH ROLLUP ve WITH CUBE yantümcelerini sunar. SQL Server 2008, konuyla ilgili GROUPING SETS isimli yeni bir operatör sunmaktadır. Bu makalede bu konudaki değişiklikleri örneklendireceğiz. GROUP BY, WITH ROLLUP ve WITH CUBE yantümceleriyle ilgili detayı aşağıdaki makalemde bulabilirsiniz.
SQL’de veri özetleme ve gizli “OLAP raporlama”
Okumaya devam et