Sayfalar

26 Aralık 2015 Cumartesi

SQL Server - “optimize for ad hoc workloads” Parametresi ile Memory’i Daha Randımanlı Kullanmak


SQL Server - “optimize for ad hoc workloads” Parametresi ile Memory’i Daha Randımanlı Kullanmak
Daha önceki bir çok yazımda da belirttiğim gibi, SQL Server çalıştırdığı query’ler için oluşturduğu query planları daha sonra kullanmak için Plan Cache’de yani memory de saklar. Daha sonraki kullanımlarda tekrar query plan oluşturmakla zaman kaybetmez, daha önce plan cache’e kaydettiği plan’ı kullanır ve buda performans artışı olarak bize geri döner.
Hem procedureler gibi parameterize edilebilen sorgular için hemde ad hoc gibi yani parameterize edilemeyen sorgular için query plan’lar oluşturulur ve plan cache’de saklanır. Procedure’ler için oluşturulmuş query plan’lar bize çok fazla problem çıkarmayacaktır. Çünkü bu planlar, sorguların parametrik olmalarından dolayı binlerce kez kullanılacaktır. Ama Ad Hoc sorgular içerdikleri parametreler ile cache’lenir ve aynı sorgu farklı bir parametre ile geldiğinde yeni bir plan cache oluşturulur. Dolayısıyla çok büyük ihtimalle ad hoc query’ler için oluşturulmuş query plan’lar sadece bir kez kullanılacaktır. Buda bize memory’de gereksiz yere yer işgali olarak geri dönecektir.

Bugünkü yazımda Ad Hoc için oluşturulan query plan’larının daha az yer kaplamasını nasıl sağlayacağımızı ve dolayısıyla memory’nin daha randımanlı nasıl kullanabileceğini görüyor olacağız.

Ufak bir örnekle Ad Hoc - Procedure kullanımının farkını açıklamaya çalışayım. Örneklerimde DBCC FREEPROCCACHE ve sys.dm_exec_cached_plans komutlarını kullanacağım için daha önce bu komutlar üzerine yazdığım makaleleri okumanızı tavsiye ederim.

Örneğimizde AdventureWorks’teki bir sp’yi 3 kez, birde Ad Hoc Query’i farklı where statement ile 2 kez çalıştıracağım.
1 --Her satır ayrı ayrı çalıştıralacaktır.
2 --use AdventureWorks
3 --SP yi 3 kez çalıştır
4 --exec dbo.uspGetEmployeeManagers 11;
5 --exec dbo.uspGetEmployeeManagers 11;
6 --exec dbo.uspGetEmployeeManagers 11;
7 --Ad Hoc sorguyu farklı parametre ile 2 kez çalıştır.
8 --select * from Person.Address where City='Bothell';
9 --select * from Person.Address where City='Portland';

Şimdi cache’len query plan’larını sorgulayalım.
1
select st.text,*
2
from sys.dm_exec_cached_plans cp
3
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
4
where (st.text like '%uspGetEmployeeManagers%'
5
or st.text like '%select * from Person.Address%')
6
and st.text not like '%select st.text%'

Gördüğünüz gibi SP için bir query plan oluşturuldu ve 3 kez aynı plan kullanıldı. Ad Hoc query’ler için ise, her bir query için bir plan oluşturuldu.

İşte bu şekilde Ad Hoc query’lerin her biri için plan oluşturulmakta ve bir çoğu 1 den fazla kullanılmamakta. Bizim amacımız bu 1 kez kullanılan plan’ların cache’de kapladığı boyutu düşürerek memory’nin diğer objeler için kullanılmasını sağlamak.

Bu amacımıza erişmek için kullanacağımız parametre “optimize for ad hoc workloads” server parametresi. Önce bir örnek yapıp daha sonra bu parametrenin ne işe yaradığını açıklayalım.

Örneğimizde Person.Address tablosuna 5 değişik where statement’ı ile select çekeceğiz.

01
--Her satır ayrı ayrı çalıştıralacaktır.

02
use AdventureWorks
03
--Once Plan Cache'i Temizleyelim.
04
DBCC FREEPROCCACHE

05
--Ad Hoc sorguyu farklı parametre ile 5 kez çalıştır.
06
select * from Person.Address where City='Bothell';

07
select * from Person.Address where City='Portland';

08
select * from Person.Address where City='Orlando';

09
select * from Person.Address where City='Montreal';

10
select * from Person.Address where City='Calgary';

Cache’lenmiş planlara bakalım.

Beklediğimiz gibi 5 ad hoc sorgusuda ayrı ayrı cache’lendi. Asıl acı olan belki bir daha hiç kullanılmayacak bu plan’ların her birinin memory’de 24 KB yer kaplaması. Bu boyut gözünüze küçük gözükebilir “24 KB mı kurtaracak benim memory’i” diyebilirsiniz. Production ortamında bu gereksiz planların 1-2 GB’a kadar yer kapladığına gözüyle şahit olan biri olarak şunu söyleyebilirim ki, 24 KB diyip geçmemek lazım :)

Bir kez kullanılan bu ad hoc query’lerin daha az yer kaplaması için “optimize for ad hoc workloads” parametresini 1 yapalım.
1

sp_configure 'optimize for ad hoc workloads',1

2

reconfigure

Şimdi select cümlelerinin olduğu sorgu bloğunu tekrar çalıştıralım.

01
--Her satır ayrı ayrı çalıştıralacaktır.
2
use AdventureWorks
03
--Once Plan Cache'i Temizleyelim.

04
DBCC FREEPROCCACHE
05
--Ad Hoc sorguyu farklı parametre ile 5 kez çalıştır.
06
select * from Person.Address where City='Bothell';
07
select * from Person.Address where City='Portland';
08
select * from Person.Address where City='Orlando';
09
select * from Person.Address where City='Montreal';
10
select * from Person.Address where City='Calgary';
Cache’lenen planlara bakalım.
Az önce 24 KB yer kaplamakta olan planlar şimdi sadece 320 byte yer kaplamakta. Yani nerdeyse 100’de 1.

Peki ama nasıl oluyor bu.
Orlando ve Montreal sorgularını 1 kez daha çalıştıralım.
1
select * from Person.Address where City='Orlando';
2
select * from Person.Address where City='Montreal';

Gördüğünüz gibi 2 defa çalıştırdığım sorguların planları “Compiled Plan” halini dönüşüp 24KB yer kaplar hale geldiler. Diğer planlarım ise “Compiled Plan Stub” tipindeler.
İşin özü şu. Bu parametre aktif hale getirildikten sonra çalıştırılan sorgular için oluşturulan query plan’ların sadece belli bir kısmı cache’lenmekte. Bu kısımda, bir sonraki aynı sorgunun çalıştırılmasında eşleştirebilmek için gerekli olan kısım. Bu kadar basit :)

30 Kasım 2015 Pazartesi

30 Mart 2015 Pazartesi

Bulunduğu ayın ilk ve son gününü bulmak

SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0) [İlk Gün],

DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)-1 [Son Gün]

24 Mart 2015 Salı

Ephesus duruduruldu hatası windows 7 ve server 2008 r2 de alınan hata



ilgili hata;

Hatalı uygulama adı: Ephesus.exe, sürüm: 5.0.10.67, zaman damgası: 0x2a425e19
Hatalı modül adı: windowscodecs.dll, sürüm: 6.1.7601.17514, zaman damgası: 0x4ce7ba3a
Özel durum kodu: 0xc0000005
Hata uzaklığı 0x00001de1
Hatalı işlem kimliği: 0x18d0
Uygulama başlangıç zamanı: 0x01cd51282f79e16b
Hatalı uygulama yolu: C:\Netsis\RCStandard\TemelSet\Ephesus.exe
Hatalı modül yolu: C:\Windows\system32\windowscodecs.dll
Rapor kimliği: 71ab4911-bd1b-11e1-a2d9-e61f13b2eb5b


Çözümü;

Bilgisayar'a sağ tıklayın ve daha sonra Özellikler'e tıklayın.
Açılan pencereden “Gelişmiş Sistem ayarları” nı seçin.
Açılan pencereden Performans bölümündeki Ayarlar… tuşuna basın.
Son olarak açılan pencerede ‘ Veri Yürütme Engellemesi ‘ sekmesine gelin ve ekle butonu ile BEX hatası veren uygulamayı seçip(bu durumda Ephesus.exe) buraya ekleyin. Ardından uygula deyin,

27 Şubat 2015 Cuma

Dekont Silme (VB)


Dekont Silme (VB)



Dim Kernel As New NetOpenX40.Kernel
Dim Sirket As NetOpenX40.Sirket
Dim Dekont As NetOpenX40.Dekont
Dim rs As NetOpenX40.NetRS

Set Sirket = Kernel.yeniSirket(vtOracle, “NETSIS”, “MALIYET2009″, “”, “NETSIS”, “1″, 0)

Set rs = Kernel.yeniNetRS(Sirket)
QueryStr = “SELECT COUNT(*) FROM TBLDEKOTRA WHERE SERI_NO=’” & SeriNo & “‘ AND DEKONT_NO=’” & DekontNo & “‘”
rs.Ac (QueryStr)
While Not rs.EOF
DekontKalemSayi = rs.Fields(0).AsInteger
rs.SonrakiK
Wend
rs.Kapat

If DekontKalemSayi = 0 Then
MsgBox “İlgili Dekont Kaydı Bulunamadı!!!”, vbInformation
Exit Sub
End If

Set Dekont = Kernel.yeniDekont(Sirket)
Dekont.Seri_No = SeriNo
Dekont.Dekont_No = DekontNo


Query = “SELECT SIRA_NO,C_M FROM TBLDEKOTRA WHERE SERI_NO=’” & SeriNo & “‘ AND DEKONT_NO=’” & DekontNo & “‘”
rs.Ac (Query)

While Not rs.EOF
Dekont.Sira_No = rs.FieldByName(“SIRA_NO”).AsInteger
Select Case rs.FieldByName(“C_M”).AsString
Case “C”
Dekont.CDekont (doSil)
Case “M”
Dekont.MDekont (doSil)
Case “B”
Dekont.BDekont (doSil)
Case “S”
Dekont.SDekont (doSil)
End Select
rs.SonrakiK
Wend
rs.Kapat

MsgBox “İşlem Tamamlandı!”, vbInformation

Set rs = Nothing
Set Dekont = Nothing
Set Sirket = Nothing
Kernel.FreeNetsisLibrary
Set Kernel = Nothing

Netopenx ile Stok Kodu Değişikliği (VB)


Netopenx ile Stok Kodu Değişikliği (VB)
Dim Kernel As New NetOpenX40.Kernel
Dim Sirket As NetOpenX40.Sirket

Set Sirket = Kernel.yeniSirket(vtMSSQL, “MALIYET”, “TEMELSET”, “”, “NETSIS”, “NET1″, 0)

Call Sirket.StokKoduDegistir(“EskiKod”, “YeniKod”, True, False) ‘True Virman Yapılsınmı,False Eski Stok Silinsinmi

Set Sirket = Nothing
Kernel.FreeNetsisLibrary
Set Kernel = Nothing

Dinamik Kodlama İle standart raporlara kolon ekleme


Dinamik Kodlama İle standart raporlara kolon ekleme


Başlıktanda anlaşıldığı gibi script yardımıyla standart rapor ekranlarına yeni bir kolon eklemek artık çok kolay. Şimdi bunu bir örnekle açıklayalım, burada ben SMAR’da (Serbest Maliyet Ambar Raporu) kalan tutar-gerçek bakiye farkını gösteren bir kolon eklemeyi yerinde buldum. Bunun için aşağıdaki adımları takip edelim;
SMAR’ı bir kere çalıştırın ve açılan rapor ekranından Netsis Script Kod Desteği’ne girin
RaporForm nesnesinin “onnetscrsys_raporkapanis” olayına aşğdaki kodu;

For i=1 To RaporBook.LastRow

call SetFormat(i)

if RaporBook.TextRC(i, 1) = “Stok Kodu” then

call SetCaption(i)

else

call SetData(i)

end if

Next


Form Global kısmınada aşağıdaki kodu;



Const NewCol = 18

Sub SetCaption(row)

RaporBook.TextRC(row, NewCol) = “Fark Tutar”

End Sub



sub SetFormat(row)

RaporBook.SetSelection row, 17, row, 17

set cf = RaporBook.GetCellFormat

RaporBook.SetSelection row, NewCol, row, NewCol

RaporBook.SetCellFormat cf

end sub



sub SetData(Row)

RaporBook.NumberRC(row, NewCol) = (RaporBook.NumberRC(row, 13)-RaporBook.NumberRC(row, 17))

End Sub


Şimdi raporu tekrar çalıştırın, işte sonuç;
SMAR

Xml dosyadan select çekme (Read an XML file from SQL Server)



DECLARE @idoc int

DECLARE @doc xml

DECLARE @TEMPSQL NVARCHAR(2000)

DECLARE @DOCPATH NVARCHAR(2000)

set @DOCPATH = ‘C:\param.xml’

SET @TEMPSQL = ‘SET @doc = (SELECT * FROM OPENROWSET(bulk ”’ +@DOCPATH + ”’,single_blob) as doc)’

EXEC SP_EXECUTESQL @TEMPSQL, N’@doc xml OUTPUT’,
@doc = @doc OUTPUT

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT * FROM OPENXML (@idoc,‘/ParametreBilgileri/OzelParametreler/PRGOZELPRM/Kayit_1′,2)
WITH (GRUPKOD varchar(20), ANAHTAR varchar(20)) WHERE GRUPKOD=‘BANKA’

EXEC sp_xml_removedocument @idoc

Fatura No Değişikliği (Netopenx)


Fatura No Değişikliği (Netopenx)




Seri kaymalarında yahut benzeri durumlarda bir çok fatura numarasının değiştitilmesi gerekebilir. Böyle durumlarda fatura numaralarını hızlıca değiştirebilirsiniz, nasıl mı….

Sub FatuNoChange()

Dim Kernel As New NetOpenX40.Kernel
Dim Sirket As NetOpenX40.Sirket
Dim Fatura As NetOpenX40.Fatura

Set Sirket = Kernel.yeniSirket(vtMSSQL, “MALIYET2009″, “TEMELSET”, “”, “NETSIS”, “NET1″, 0)

Set Fatura = Kernel.yeniFatura(Sirket, ftSFat)

Call Fatura.OkuUst(“X00000000000009″, “00003″) ‘ Eski Fatura No, Eski CariKod
Call Fatura.OkuKalem
Call Fatura.NumaraDegistir(“X00000000000010″, “00003″, False)
‘Yukarıda girilen parametreler sırasıyla Yeni Fatura No, Yeni Cari Kod, Teslim Cari Değişsinmi

Set Fatura = Nothing
Set Sirket = Nothing
Call Kernel.FreeNetsisLibrary
Set Kernel = Nothing

End Sub

SQL Server Veritabanı Log Dosyasının Küçültülmesi

SQL Server Veritabanı Log Dosyasının Küçültülmesi

MS SQL 2005 VE ALTI
USE veritabaniadi
GO
BACKUP LOG veritabaniadi WITH TRUNCATE_ONLY
DBCC SHRINKFILE(veritabaniadi_log)
GO


MS SQL 2008 sürümünde ise

USE veritabaniadi
GO
ALTER DATABASE veritabaniadi SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE(veritabani_log)
ALTER DATABASE veritabaniadi SET RECOVERY FULL WITH NO_WAIT
GO