ERP sistemleri, kurumların yoğun verisi altında çalışırken performanslı çalışmaları hem çalışanın çalışma motivasyonunu olumlu etkiler hem de işlemlerin akıcı olması zamanın verimli kullanılmasını sağlar. ERP sistemlerinin performansını etkileyen en önemli konulardan biri de verilerini üzerinde sakladığı veri tabanı sisteminin performans bakımıdır. Bu yazımızda SQL Server üzerinde çalışan SAP sisteminde ki tabloların indeks bakımı işlemini inceleyeceğiz.
SQL Server üzerinde yer alan görev tanımlayıcı ile bütün tabloların indeks bakımı yapıldığında sayısı yüz bin üzerinde olan tabloların bakımı hem çok uzun sürecek hem yüzlerce GB’lık verinin indekslenmesi sırasında yine yüzlerce GB log verisi ortaya çıkacaktır ki bunu yedeklemek ciddi bir maliyet olarak karşımıza çıkacaktır. Tabloların toplu bakımı yerine aşağıda tarif edeceğimiz şekilde tasarlanacak bir yapıda indeks bakımını ciddi oranda kolaylaşacaktır.
Yapımızı adım adım kurmaya başlayalım.
Aşağıdaki ekran görüntüsünde görüldüğü yapıda bir tablo ile indeks bakımının yapılmasını istediğimiz tabloların bilgilerini kaydediyoruz. Tablo alanlarının açıklaması aşağıdaki gibidir:
ZSCHEMA : SQL Server üzerinde SAP tablolarının çalıştığı şema adıdır.
ZMODUL : Tablonun birinci derece hangi SAP modülü ile ilgili olduğunun tutulduğu alandır.
ZTABLE : Bakımının yapılması istenen tablo adıdır.
ZREBUILD : Job çalışma sırasında tablonun index bakımının yapılıp yapılmayacağını belirtir. X işaretli olması rebuild işleminin yapılacağını belirtir.
ZISTATISTIK : Job çalışma sırasında tablonun istatistik güncelleme işleminin yapılıp yapılmayacağını belirtir. X işaretli olması istatistik güncelleme işleminin yapılacağını belirtir.
Rebuild ve istatistik bakımlarının iki farklı alanda tutulma sebebi, bazı tablolarda rebuild yapılmayıp sadece istatistik güncelleme işleminin yapılmak istenebileceğidir. Ya da rebuild yapılıyorken geçici olarak işlemi iptal etmek için X işareti kaldırılabilir.
Tabloya örnek veri girişimiz aşağıdaki gibidir.
SAP tarafında tabloyu hazırladıktan sonra şimdi de sıra SQL Server tarafında işlemi yapacak olan ilgili stored prosedürü yazmaya geldi sıra.
—
CREATE PROC [dbo].[REBUILDINDEXES]
@TABLENAME AS VARCHAR(1000)='%',
@FILLFACTOR AS INT=70,
@SCHEMA AS VARCHAR(3),
@REBUILD AS VARCHAR(30) = '',
@STAT AS VARCHAR(30) = ''
AS
DECLARE @FRAGMANTATIONBEFORE AS FLOAT
DECLARE @TABLENAME2 AS VARCHAR(1000)
DECLARE CRS CURSOR FOR SELECT name FROM sysobjects WHERE xtype='U' AND name LIKE @TABLENAME
OPEN CRS
FETCH NEXT FROM CRS INTO @TABLENAME2
WHILE @@FETCH_STATUS=0
BEGIN
SET @TABLENAME2 = @SCHEMA+ '.' + @TABLENAME2 -- şema adı ekle
SELECT @FRAGMANTATIONBEFORE=avg(avg_fragmentation_in_percent) FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@TABLENAME2), NULL, NULL , 'LIMITED')
-- WHERE index_type_desc <>'CLUSTERED INDEX'
DECLARE @SQL AS NVARCHAR(MAX)
IF @REBUILD = 'X' and @FRAGMANTATIONBEFORE > 25
BEGIN
SET @SQL='ALTER INDEX ALL ON '+@TABLENAME2+' REBUILD WITH (FILLFACTOR='+CONVERT(VARCHAR,@FILLFACTOR)+', ONLINE = ON)'
EXEC sp_executesql @SQL
END
SET @SQL='UPDATE STATISTICS '+@TABLENAME2
IF @STAT = 'X'
BEGIN
EXEC sp_executesql @SQL
END
FETCH NEXT FROM CRS INTO @TABLENAME2
END
CLOSE CRS
DEALLOCATE CRS
GO
Oluşturulacak REBUILDINDEXES stored prosedürü ile kendisine gelen parametreleri kullanarak dinamik SQL oluşturulup bu sorgu çalıştırılır.
İşleme başlamadan önce @FRAGMANTATIONBEFORE değişkenine tablonun bozulma oranı atanıyor. Bu atama ile bozulma belli bir oranın üstünde ise rebuild işlemi yapılmış oluyor. Prosedürün var sayılan değeri 25 olarak ayarlanmış, siz kendinize göre de bu değeri değiştirebilirsiniz.
Şimdi de SAP tablosundan bakımının yapılması istenen tabloları alıp yukarıda oluşturduğumuz stored prosedürü çalıştırarak indeks bakımını başlatacak olan prosedürü yazalım.
—
CREATE PROC [dbo].[BUILDTABLESFROMLIST]
AS
DECLARE @SCHEMA2 VARCHAR(3)
DECLARE @TABLENAME2 VARCHAR(200)
DECLARE @REBUILT AS VARCHAR(1)
DECLARE @STAT2 AS VARCHAR(1)
declare @disksize int
DECLARE CRS1 CURSOR FOR SELECT [ZSCHEMA], [ZTABLE], [ZREBUILD], [ZISTATISTIK] FROM msp.ZIT_T001
OPEN CRS1
FETCH NEXT FROM CRS1 INTO @SCHEMA2, @TABLENAME2, @REBUILT, @STAT2
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SCHEMA2 = LOWER(@SCHEMA2)
SELECT
@disksize = convert(int,dovs.available_bytes/1048576.0)
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) dovs where dovs.volume_mount_point = 'P:\'
if @disksize > 100000
begin
exec dbo.REBUILDINDEXES @TABLENAME = @TABLENAME2, @SCHEMA = @SCHEMA2, @REBUILD = @REBUILT, @STAT = @STAT2
end
else
begin
close CRS1
DEALLOCATE CRS1
end
FETCH NEXT FROM CRS1 INTO @SCHEMA2, @TABLENAME2, @REBUILT, @STAT2
END
CLOSE CRS1
DEALLOCATE CRS1
GO
Bu prosedürü kullanmadan önce kendimize göre düzenlememiz gereken iki parametre vardır. Bunlar aşağıdaki gibidir:
“where dovs.volume_mount_point = 'P:\'” satırında yer alan P ifadesini SAP veri tabanımızın T-LOG dosyasının bulunduğu disk harfi ile değiştirmemiz gerekmektedir.
Diğer parametre ise:
“if @disksize > 100000” satırındaki 100000 değeridir. Burada yapılmak istenen işlem de ilgili diskte boş alan 100 GB üzerinde ise bakımın yapılmasını sağlamaktır.
Bütün bu tamamlamalar yapıldıktan sonra geriye kalan tek işlem SQL Server’da indeks bakımını yapacak joba görev olarak BUILDTABLESFROMLIST stored procedürünü vermektir.
Örnek görev aşağıdaki gibidir:
Sait Orhan
Bilgisayar Mühendisi
Comments