MSSQL Server Execution Plan Paralelizm Kavramı

Bu makalede MSSQL Server Execution Plan Paralelizm Kavramını detaylı bir şekilde görmüş olacağız. SQL Server’da özellikle maliyeti yüksek olan sorgularımızın Execution planlarını incelediğimizde SQL Server’ın işlemleri yapmak için Paralelizmi kullandığını görebiliriz. Paralelizm kavramını SQL Server açısından ele alacak olursak bir işlemin izin verildiği ölçüde birden fazla parçaya bölünmesi ve her bir parçanın yine izin verilen ölçüde bir işlemci tarafından çalıştırılmasıdır. Bu sebeple SQL Server tarafından Paralelizmin kullanılabilmesi için makinemiz üzerinde birden fazla işlemci olması gerekmektedir. SQL Server paralelizmi kullanmaya karar verdiği zaman yapılacak işlem daha küçük iş parçacıkları yani Thread’lere eşit miktarda bölünecek ve bölünen parçalar üzerinde aynı işlem yapılacaktır. Örneğin elimizde sadece iki tane CPU ya sahip bir makine olduğunu düşünelim. Tek ve çift sayılardan oluşan bir veri kümesi üzerinde gruplama yaptığımızı varsayarsak SQL Server temsili olarak aşağıdaki gibi paralelizmi kullanabilecektir.

Yukarıdaki resimde dikkat ederseniz SQL Server 2 farklı Thread kullanmış ve aynı işlemi yani gruplama işlemini yapmak için kayıt kümesini düzgün şekilde bölmüştür. SQL Server’ın Paralelizm kullandığı Execution planlara Paralel Execution plan denirken Paralelizmin kullanılmadığı Execution planlar ise Seri Execution plan olarak adlandırılmaktadır. Paralel Execution planları Seri Execution planlardan ayıran özellik ise grafiksel planda kullanılan ok işaretleriyle Paralel Execution plana has operatörlerdir. Örneğin aşağıdaki gibi bir Execution planda SQL Server Paralelizmi kullanmıştır.

Yukarıdaki Execution planımızda operatörlerin üzerinde gördüğümüz ok işaretleri SQL Server’ın paralelizmi kullandığı anlamına gelmektedir.

Paralelizm IO ve CPU değeri yüksek sorgularda genelde SQL Server tarafından tercih edilse bile hem Paralelizm konusunu anlamak için hem de SQL Server’ın maliyeti yüksek olan sorgularda Paralelizmi kullanmasının sebeplerini öğrenmek için SQL Server’ın ileri seviye bir kaç özelliğini bilmemiz gerekmektedir. Bunlardan ilki Affinity mask ayarıdır. Affinity mask ile kabaca ile SQL Server tarafından kullanılmasını istediğimiz işlemcileri ayarlarız. Yani daha açık bir ifadeyle makine üzerinde 8 işlemci olduğunu düşündüğümüzde bu 8 işlemciden hangilerinin SQL Server tarafından kullanılabileceğini Affinity mask değeri ile belirleyebiliriz. Affinity mask değeri varsayılan olarak 0 olup bu değer tüm işlemcilerin kullanılabileceği anlamına gelmektedir.

Bir diğer paralelizm parametresi ise Max Degree of Parallelism ayarı olup bu değer SQL Server’ın sorgularımızda paralelizm kullanmayı tercih ettiği durumlarda kullanacağı maksimum işlemci sayısını belirtmektedir. Bu ayarın da varsayılan değeri 0 olup bu değer SQL Server’ın sorgularımızı çalıştırırken Paralelizmi tercih ettiği durumlarda tüm uygun işlemcileri kullanabileceği anlamına gelmektedir. SQL Server tarafından Paralelizmin kullanılması gereken bu ayarda aslında varsayılan olarak açık gelmektedir Bu da SQL Server’ın uygun durumlarda Execution planı oluştururken Paralelizm seçeneğini de kullanmasına olanak sağlamaktadır. 

Affinity mask ve Max Degree of Parallelism ayarlarını aşağıdaki sorgularımız ile görebiliriz.

SELECT * 
FROM sys.configurations 
WHERE NAME LIKE 'affinity mask' 
 
SELECT * 
FROM sys.configurations 
WHERE NAME LIKE 'max degree of parallelism'

SQL Server tarafından Execution plan oluşturulurken paralelizm kullanılıp kullanılmayacağı karar verilirken sorgunun maliyetine bakılır ve bu maliyet SQL Server seviyesinde bir ayar olan cost threshold for parallelism değerinden büyükse SQL Server tarafından sorgunun paralel çalıştırılması tercih edilir. Cost threshold for Parallelism değeri varsayılan olarak 5 olup bu değer OLTP sistemler için genelde düşük bir değerdir. Bu sebeple bu değerle SQL Server birçok durumda paralelizmi tercih edecektir. Paralelizm kavram olarak sorgunun küçük parçalar halinde eş zamanlı çalıştırılması olsa bile maliyeti düşük olan sorguların paralel çalıştırılması performansı da olumsuz etkileyecektir. Bu sebeple paralelizm her sorguda değil sadece gerçekten gerekli olan sorgularda kullanılmalıdır. İşte cost threshold for parallelism ayarı da tam da bu noktadan bizim için paralelizmin ne zaman kullanılması gerektiğine dair bir eşik değer belirtmektedir. SQL Server’ın performansını doğrudan etkileyebilecek olan bu değerin gerekli incelemeler yapıldıktan sonra iyi ayarlanması gerekmektedir. Cost threshold for parallelism değerini aşağıdaki gibi görüntüleyebiliriz.

SELECT * 
FROM sys.configurations 
WHERE NAME LIKE 'cost threshold for parallelism' 

Ayrıca bu değeri sp_configure sistem Stored procedure’unu kullanarak da değiştirebiliriz.

sp_configure 'cost threshold for parallelism', 6 
GO 
RECONFIGURE 
GO 

SQL Server’ın paralel Execution Planlarda işlemleri paralel yaparken sık kullandığı Distribute Streams, Gather Streams ve Repartition Streams operatörlerine değinelim. Bu makalede paralelizm konusunu ele almış olduk. Bundan sonraki makalelerde kullanılan diğer operatörleri görebiliriz. Başka bir makalede görüşmek dileğiyle.

“Andolsun ki vaktiyle Lokmân’a şu hikmeti vermiştik: “Allah’a şükret, O’na şükreden kendi iyiliği için şükretmiş olur; nankörlük eden de bilmelidir ki Allah’ın hiçbir şeye ihtiyacı yoktur, O her türlü övgüye lâyıktır.””Lokman-12

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir