如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2004年12月3日

SAP Where與Index間最佳化的運作

吃掉SAP Performance第一名的元兇就是ABAP程式中select .. where的where後加的判斷欄位不是table的索引
例如 : select * from xxxx where f1 = "abc" and f2 = "def"
...
其中database table並沒有key為f1+f2的index

那麼Where與Index間最佳化的運作是怎樣?

1. 第一當然是為大量存與常用的select..where建立index, 但是每個database table不可以超過五個indexes,而且這些index的key也不應該包含過多的欄位
2. Where後的邏輯判斷最好使用等式及AND的組合,例如 where f1="abc" and f2 = "def", 而f1+f2就是某個index的key
3. Where後的邏輯判斷最若使用<>或NOT, 則即使判斷欄位為index的key, 也不支援索引的搜尋
4. Where後的邏輯判斷使用索引的部份的key,則where後的判斷欄位應該以索引的key
s的順序排列, 例如索引的key為f1+f2+f3,則用 where f1="abc" and f2 = "def"是正確的
5.若有or與and混合用於where中,則or應該在邏輯判斷的較高層
例如 : where (carrid='LH' and cityfrom='frankfurt') or
(carrid='LH' and cityfrom='new york')
比下面的句子好
where carrid='LH' and
(cityfrom='frankfurt' or cityfrom='new york')
6.where中對索引欄位的邏輯判斷不要用is null

另外,如果secondary index的key非唯一(unique)則該key可以抓到的值不要超過table的5% (否則效果不好)

您若能遵循上面原則,則您的程式就不會成為SAP Performace的殺手

沒有留言:

張貼留言

歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)