Service Manager mimarisinde filtreleme yapacağımız günlük işlerde olmazsa olmazımızdır. Gerek bilgi amaçlı kullanacağımız anlık sorgularda, gerek raporlama için kullandığımız sorgularda gerekse konsol üzerinden yaptığımız sorgulamalarda her zaman belli kriterler ile verileri veritabanından çekeriz.
Yoğun veri barındıran veritabanları üzerinde bu tarz işlemleri yaptığımızda düşünmemiz gereken bir husus daha ortaya çıkar. PERFORMANS!!! J
Bu amaçla yazacağımız scriptler için performans durumunu da düşünmemiz gerekir. Günün belli saatinde çalışacak scripler için bunu göz ardı edebilirsiniz ancak belli kriterlere göre anlık tetiklenen script workflow’larda ya da custom yazılmış dashboard bileşenlerinde bu durumu göz önünde tutmamız gerekiyor.
Önceki makalelerimde –Filter parametresinin where koşuluna göre daha performanslı olduğunu söylemiştim. Ama –filter’ın eksi yönü tek operator desteklemesi ve and, or sorguları kullanacağımız durumları karşılayamaması idi.
Şimdi sorguları biraz daha advanced hale getirebiliriz. Kullanacağımız yöntem server side filtering ve multiple criteria yı destekliyor. Bu nun için biraz daha fazla kod yazmamız gerekecek (bir kaç satır fazla) ancak performans artışını göze aldığımızda gösterdiğimiz çabaya değecektir.
Basit bir örnekle açıklayayım.
Bizim klasik powershell scriptlerde ve gündelik komutlarımızda kullandığımız where koşul ifadesi ile durumu Closed ya da Resolved olmayan ve en fazla 15 gün öncesine kadar oluşturulmuş olay kayıtlarını elde edip $OlayObjeleri değişkenine atayalım. (Daha önceki makalelerimde bu yapıları ayrıntılı olarak anlatmıştım.) Farklı olarak scriptin performansını measure-Command cmdlet’i ile ölçelim.
measure-Command {
Import-module
SMLets
$Date
= (Get-Date).AddDays(-15)
$OlayClass
=
Get-SCSMClass
–Name
System.WorkItem.Incident$
$Closed
=
Get-SCSMEnumeration
-Name
IncidentStatusEnum.Closed
$Resolved
=
Get-SCSMEnumeration
-Name
IncidentStatusEnum.Resolved
$OlayObjeleri
=
Get-SCSMObject
-Class
$OlayClass
|
where{$_.Status -ne $Closed
-and
$_.Status -ne $Resolved
-and
$_.CreatedDate -gt $Date} }
Script çalıştıktan sonra aşağıdaki gibi bir çıktı veriyor ve veriyi elde etmesi 18 saniye sürüyor. Toplamda 227 adet veri elde etmiş oluyor.
Resim-1
Şimdi de sorgumuzu biraz advanced hale getirelim. Biraz daha karmaşık olacak belki ya da daha fazla komut yazmamız gerekecek ancak performans farkı görülmeye değer J (Script’e ilişkin açıklamaları komutların üzerinde bulabilirsiniz.)
Yine Aynı şekilde measure-Command cmdlet’i ile script performansını ölçelim.
measure-Command {
Import-module
SMLets
$Date
= (Get-Date).AddDays(-15)
$OlayClass
=
Get-SCSMClass
–Name
System.WorkItem.Incident$
#Enumeration değerlerini değişkenlere atayalım. Bunların ID attribute’ları burada gerekli olacak.
$Closed
= (Get-SCSMEnumeration
-Name
IncidentStatusEnum.Closed).ID
#Şimdi bir kriter tipi belirlememiz gerekiyor. Bunu genelde C# ile service Manager’a uygulama geliştirdiğimizde kullanıyoruz.
$CriteriaType
=
“Microsoft.EnterpriseManagement.Common.EnterpriseManagementObjectCriteria”
#Şimdi kriterin kendisini belirtelim. Where ile belirttiğimiz kriterden çok farklı değil.
$Criteria
=
“Status != ‘$Closed‘ and Status != ‘$Resolved‘ and CreatedDate > ‘$Date‘”
#Şimdi kriter tipini ve kriterin kendisini kullanıp filtremizi oluşturalım.
$OlayFilter
=
New-Object
–Type
$CriteriaType
$Criteria,$OlayClass
#Son olarak ilgili kriteri kullanıp olay objelerini elde edelim.
$OlayObjects
= @(Get-SCSMObject
–Criteria
$OlayFilter)
}
Script’in çalışması milisaniyeler ile gerçekleşiyor. Sorgu aynı sorgu fakat şekilde saniyeye göz attığınızda SIFIR olarak göze çarpıyor . Obje sayısı ile aynı. 227
J
Resim-2
18 saniyeye sıfır saniye J Elde edilen obje sayıları da aynı J
Tamam komutlar diğerine göre hafif karışık ama performans görülmeye değer. İkisi de aynı işi yapıyor.
Tercih sizin J
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar