oracle nested loop lardan kaçınmak için use_hash ipucu

Veri ambarında çok sayıda kayıt içeren tabloları join lediğimizde çeşitli sebeplerden dolayı (tabloların istatistiğinin henüz alınmamış olması, optimizer ın çalıştırma planını [execution plan] değiştirmek için, vs.) çalıştırma planında [execution plan] nested loop oluşabilir. Bu durum sorgu performansının önemli ölçüde düşmesine sebep oluyorsa Oracle çalıştırma planına müdahale etmek için use_hash ipucu (use_hash hint, hash join) kullanılabilir.

Düz/Normal sorgu:

select t1.*, t2.*
from t1, t2
where t1.b = t2.b

Sorguyu paralel çalıştırmak için:

select /*+ parallel(t1,4) parallel(t2, 4) */
t1.*, t2.*
from t1, t2
where t1.b = t2.b

Sorguyu hem hash join ile hem de paralel çalıştırmak için

select /*+ use_hash(t1,t2) parallel(t1,4) parallel(t2, 4) */
t1.*, t2.*
from t1, t2
where t1.b = t2.b

Oracle With As Kullanımı

Oracle Sql İyileştirme / En İyi Pratik (Oracle Sql Tunning / Best Practice)

Oracle Sql ile çalışırken örnek şöyle bir ihtiyacımız olsun:

t_islem (islem_no, islem_tarihi, islem_tutari, islem_tipi_no)
t_islem_tipi (islem_tipi_no, islem_tipi_tanim, islem_tipi_olusturulma_tarihi)

Yukarıdaki iki tablo gibi tablolarımız olsun, t_islem tablosu da günlük ya da aylık partion lı (içindeki veriye göre parçalı, bölünmüş) çok sayıda kayıt içeren bir tablo olsun. Amacımız da dönemlik toplamların yanına yıllık toplamları getirmek olsun.

Geleneksel çözüm:

select t1.yil_ay,
t1.islem_tipi_tanim,
t1.tutar as yil_ay_tutar,
t2.tutar as yil_tutar
from
(
    select to_number(to_char(t_islem.islem_tarihi,'YYYYMM')) as yil_ay,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYYMM')),
    t_islem_tipi.islem_tipi_tanim
) t1,
(
    select to_number(to_char(t_islem.islem_tarihi,'YYYY')) as yil,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYY')),
    t_islem_tipi.islem_tipi_tanim
) t2
where trunc(t1.yil_ay/100) = t2.yil
and t1.islem_tipi_tanim = t2.islem_tipi_tanim

With As ile geçici tablo (kaynak yeterliliğine göre çoğunlukla bellekte) oluşturularak ve daha az kod ile:

with t1 as (
    select to_number(to_char(t_islem.islem_tarihi,'YYYYMM')) as yil_ay,
    t_islem_tipi.islem_tipi_tanim,
    sum(islem_tutari) as tutar
    from t_islem,
    t_islem_tipi
    where t_islem.islem_tipi_no = t_islem_tipi.islem_tipi_no
    group by to_number(to_char(t_islem.islem_tarihi,'YYYYMM')),
    t_islem_tipi.islem_tipi_tanim
)
select t1.yil_ay,
t1.islem_tipi_tanim,
t1.tutar as yil_ay_tutar,
t2.tutar as yil_tutar
from t1,
(
    select trunc(yil_ay/100) as yil,
    islem_tipi_tanim,
    sum(tutar) as tutar
    from t1
    group by trunc(yil_ay/100),
    islem_tipi_tanim
) t2
where trunc(t1.yil_ay/100) = t2.yil
and t1.islem_tipi_tanim = t2.islem_tipi_tanim

Excel VBA ile Sütun Satır Çevrilmesi (Unpivot)

k1, k2, k3, ssc_kaynak_1, ssc_kaynak_2, ssc_kaynak_3, ssc_kaynak_4, ssc_hedef_1,ssc_hedef_2

Kolonlarına sahip bir excel dosyasını

k1, k2, k3, ssc_kaynak, ssc_hedef

kolonlarına sahip hale getirmek için aşağıdaki VBA (Visual Basic Applications) Script kullanılabilir. Buradaki amaç ssc_kaynak kolonları için 4 kolonu 4 satıra, ssc_hedef kolonları için 2 kolonu 2 satıra, toplam 4+2=6 kolonu 4*2=8 satıra çevirmek.

Örneğin:

veri_k1,veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_kaynak_2, veri_ssc_kaynak_3, veri_ssc_kaynak_4, veri_ssc_hedef_1, veri_ssc_hedef_2

halinden aşağıdaki hale çevirmek

veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_1, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_2, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_2, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_3, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_3, veri_ssc_hedef_2
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_4, veri_ssc_hedef_1
veri_k1, veri_k2, veri_k3, veri_ssc_kaynak_4, veri_ssc_hedef_2

excel_vba_unpivot.xlsm.zip


Option Explicit
Dim sourceWorksheet As Excel.Worksheet
Dim targetWorksheet As Excel.Worksheet
Dim sourceWorksheetRowCount As Integer
Dim targetWorksheetI As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer

Sub Unpivot()

    Set sourceWorksheet = ThisWorkbook.Worksheets("normal")
    Set targetWorksheet = ThisWorkbook.Worksheets("unpivot")
    targetWorksheet.Unprotect

    targetWorksheet.Cells(1, 1).Value = sourceWorksheet.Cells(1, 1).Value
    targetWorksheet.Cells(1, 2).Value = sourceWorksheet.Cells(1, 2).Value
    targetWorksheet.Cells(1, 3).Value = sourceWorksheet.Cells(1, 3).Value
    targetWorksheet.Cells(1, 4).Value = sourceWorksheet.Cells(1, 4).Value
    targetWorksheet.Cells(1, 5).Value = sourceWorksheet.Cells(1, 8).Value

    sourceWorksheetRowCount = sourceWorksheet.UsedRange.Rows.Count
    targetWorksheetI = 2

    For i = 2 To sourceWorksheetRowCount
        For j = 4 To 7
            For k = 8 To 9
                If (IsNull(sourceWorksheet.Cells(i, j)) = False And Trim(sourceWorksheet.Cells(i, j).Value) <> "" And IsNull(sourceWorksheet.Cells(i, k)) = False And Trim(sourceWorksheet.Cells(i, k).Value) <> "") Then
                    targetWorksheet.Cells(targetWorksheetI, 1) = sourceWorksheet.Cells(i, 1)
                    targetWorksheet.Cells(targetWorksheetI, 2) = sourceWorksheet.Cells(i, 2)
                    targetWorksheet.Cells(targetWorksheetI, 3) = sourceWorksheet.Cells(i, 3)
                    targetWorksheet.Cells(targetWorksheetI, 4) = sourceWorksheet.Cells(i, j)
                    targetWorksheet.Cells(targetWorksheetI, 5) = sourceWorksheet.Cells(i, k)
                    targetWorksheetI = targetWorksheetI + 1
                End If
            Next k
        Next j
    Next i

End Sub

Sap BO Webi tercihlerini ya da görüntüleme ve değiştirme varsayılan modunu kopyalamak

Sap Business Objects BI Çalışma Alanında (BI Launchpad) kullanıcılar için varsayılan olarak görüntüleme (view) ve değiştirme (modify) ayarları bir grubun tamamına uygulanmak istenirse Sap’nin yayınladığı aşağıdaki notta yer alan kod kullanılabilir. JSP kodu (Java SDK) ile sistemde tanımlı bir kullanıcının tercihlerinin verilen gruptaki kullanılara uygulanması sağlanıyor.

CopyWebiPreferencesWithoutDBCredentials.zip

setGroupPreferences.zip

Kaynaklar:
2206931 – How to set default View and Modify settings in Webi Preferences in BI 4.x
1659566 – How to Apply Preferences to All User Accounts in BI 4.x programmatically

Sap BO Java SDK (JSP) ile Windows AD veya LDAP kullanıcıları için Enterprise Alias oluşturulması

Sap Business Objects ortamında tüm kullanıcılar için bir değişiklik yapılması ihtiyacı olursa aşağıdaki Sap notunda sağlanan Jsp (Java SDK) koduyla tüm Windows Active Directory (Win AD) veya LDAP kullanıcıları için alias oluşturulabilir, ve sonra silinebilir.

Aynı işlem Sap BI Platform Support Tool ile de gerçeklenebilir. (Sap BI Platform Support Tool > Landscape Tools > Enterprise Alias Manager)

Add-Remove Aliases (per user type).zip

Kaynak:
1804839 – How to add or remove secEnterprise aliases via JSP script in BI 4.x