Google Search

自訂搜尋

2009年6月22日 星期一

[Career] IT 的價值何在?

近來心情低落, 因為本人負責公司的ERP系統開發, 已經忙到不行,但是使用者卻始終對IT充滿抱怨. 不是抱怨Request排的時程太晚,緩不濟急就是對系統規則不瞭解,卻不斷抱怨是系統問題. 這時所有IT人員面對了一個同樣的問題, 就是IT的價值到底在哪裡?

事情的引發點是本公司的採購經理和資財經理對IT的需求常常是將IT視為魔術師. 怎謂魔術師呢? 舉例而言: 現有的請採購流程對採購人員而言負擔較重而採購經理在其副總的人員精簡要求之下, 提出了流程改善的需求. 但是問題來啦: 採購流程不是只和採購人員相關, 此流程和倉管 , 財務, IQA 無不關係甚鉅. 因此要決定新的流程之前, 一定要和舊流程比較去瞭解之間差異以及對相關部門的影響. 但是採購經理眼高手低, 只看大方向不管細節, 他指定出來談系統流程的人員也是鴉鴉烏,對流程一知半解. 流程無法合理化怎麼談系統化呢? 眼看副總壓力不減, 就拿著副總令箭要求IT限期將他談出來2266的新流程在我們家已經殘破不堪的SAP中做改善! 這時大概只有魔術師才能實現採購經理的夢想.

另外一個問題就是很多IT的系統開發完成後, 通常落得無人使用的下場. 為何? 因為很多公司內部Top-Down的專案都有很高的理想性, 但因為Top-Down, 不得不做. 接手專案的人也不願多花時間去思考公司高層的真正目的去勾勒出叫可行的方案. 而硬要IT根據不合理的流程去開發系統來應付高層指示. 所以本公司光的 Issue Tracking 的系統就有好幾套, 每套壽命都不長.

唉! 這真是IT的宿命嗎? 上週遇上一名來自西門子的工程師, 席間談及IT的權責問題. 他說在西門子的IT對他們使用者的服務的模式, 舉例而言, 如下:
- 網路頻寬可選擇, 2M, 5M或10M 都可以, 但是要付費而且是新台幣.
- 要找IT談需求可以, 談一小時, 多少錢. 兩小時多少錢, 一率照算.

這有甚麼好處? 舉例而言:
- 常常公司高層會要求IT提供資料去看有沒有公司員工在上班時間濫用公司網路上一些色情網站.但是今天試想如果頻寬是使用者付費, 第一個部門經理一定會視需求去決定頻寬, 因為要求過多的頻寬只會墊高部門成本. 在適當的頻寬之下, 只要有員工上網浪費頻寬就會造成其他正常使用網路員工的不便. 這時部門經理會主動管理這件事情, IT有沒有工具相對就不是那麼重要.

- 使用者會更加主動的瞭解自身的作業流程以及此流程和其他部門的影響. 因為若不瞭解, 不斷的對IT提出新的需求, 一樣造成部門成本的問題. 當使用者可以將需求品質提升, IT也可以將精力留給更多需要IT幫忙的部門, 整個公司也才可以透過系統的力量更快速成長而不是每天將精力耗費在不完整的需求上面不斷的修改系統.

但是要做到這個程度其實有相當程度的困難, 就是如何精準的量化IT的服務. 另外就是為了將IT服務費用化, 所產生的管理成本是否是公司所願意承擔? 種種問題都待深為IT的你我多思考!

以下的IT服務費用化的一些文章, 供大家參考!

http://www.cioupdate.com/budgets/article.php/3483756/IT-Cannot-be-a-Profit-Center.htm

http://www.zdnet.com.tw/enterprise/technology/0,2000085680,20103371,00.htm

http://www.ithome.com.tw/itadm/article.php?c=50165

http://www.risnews.com/ME2/dirmod.asp?sid=598EAD7FB93F43D6B43B76311F2C2119&nm=&type=Blog&mod=View+Topic&mid=67D6564029914AD3B204AD35D8F5F780&tier=7&id=13CB00EEE1AE452585A8A1D6BAFAE64E

[ERP] 甲骨文搶走SAP客戶

今天一篇來自中時新聞的這篇文章, 節錄部分於下:
==================================================================
甲骨文搶走SAP客戶
  • 工商時報 2009-06-23

  • 【鍾志恒/綜合外電報導】

 美國的甲骨文與德國的思愛普(SAP)是商用軟體市場上的死對頭,互不相讓,然而近來甲骨文大肆併購,對SAP造成莫大威脅,搶走不少SAP的客戶,讓SAP第一季新軟體銷售大跌。在此同時,市場專家也看好甲骨文前景,並且看淡SAP。專家指出,在與甲骨文的競爭中,SAP已屈居下風,若不再思振作,其為商業管理軟體霸主的地位可能因此拱手讓人。

==================================================================

原文部分在, 原文的解說較完整但談的重點還是Oracle在經過這幾年的併購整合後, 提供企業 One-Stop Shopping(一站買足), 整體成本較低. 因此有後來居上之勢.

本人服務的公司在2008年正式導入SAP ERP後至今已一年半, 大小問題仍然不斷. 這些問題的源頭到不在SAP產品的瑕疵(當然有一部分), 主要問題在SAP ERP的產品策略問題.

怎麼說問題和產品策略有關呢? 如同大家所知, SAP的產品策略強調所謂的 Best Practice, 也就是遵循SAP所建議的作業模式和流程設計為主體若有差異在透過設定(Config)去調整, 但這衍生了幾個問題.

1. SAP ERP將所有不同產業和商業模式全部含跨在一個產品裡, 造成產品本身的複雜度極高, 因此不要講我們這些MIS, 就算SAP原廠或者一些外商顧問大概都很難搞清楚全貌. 所謂的
設定(Config), 複雜到不行.

2.
產品的複雜造就下一個問題就是ERP系統的後續改善和維護問題, MIS多數是見樹不見林的在和使用者談需求和改系統. 原因就是產品的複雜性造成. 這時SAP一定會說, 買顧問的 Man-day 來協助MIS啊? 哈!有多少公司負擔得起長期支付顧問的費用啊? (一天兩萬四千元起跳). 而且如同第一點所講, 這些顧問也許經驗稍多但是面對SAP這座黑森林, 很多問題也不是一十半刻可以給答案.

這時很不幸的, 本公司屬於IC代工產業, 內部流程直接或間接的受到客戶端供應鏈設計的影響(本公司有上百家客戶), 因此很難定義出所謂的 Best Practice. 內部的流程都釐不出頭緒, 又要如何和SAP的 Best Practice作差異分析. 因此討論出來的系統就是'Add-On' 在'Add-On', PP(Production Planning) & MM (Material Management) & SD (Sales Dietribution) 幾乎80%以上都是外掛程式, 只有財務相關模組倖免於難. 這時前面兩點談的問題加上第三點又讓問題變更複雜, 就是所謂的 'Add-On' 的語言ABAP的架構, 和SAP的標準程式的架構有很多問題. 舉例而言,很多外掛程式的設計是將一個使用者的動作前半部利用標準程式做, 後半部用外掛程式. 這時使用者的操作過程中發生異常, 請問整個交易可以Rollback嗎? 答案是不行, 這時可憐的MIS就要半夜起床幫使用者查問題, 更正資料. 哈! 怎麼也沒想到這麼昂貴的SAP居然提供這樣的架構. 交易的ATOMIC不是系統架構的基本觀念嘛?

另外對IT人員而言, Oracle走的是比較開放的架構而且相對而言, 外掛程式的開發較容易. 因此很樂見Oracle慢慢後來居上, 看看公司三五年後能否有機會, 轉換平台, 讓大家的日子好過點.

但是其實網路上還有一篇文章
, 談的是不論是SAP或者 Oracle, 他們的商業模式都有一樣的問題, 若沒有改善, 在下個十年應該會面臨市佔下滑的問題.(這篇文章的作者是另外一家ERP廠商, 因此也許部分言論會有所偏瓿, 但是還是有可取之處). 他談到SAP和Oracle有以下問題:

1. : 產品貴, 導入費用貴, 每年的維護費更貴而且還是看使用者帳號收費(一年一個帳號十幾萬, 三千人規模的公司買一百個帳號, 年繳就要一千多萬), MIS的開發帳號照樣按人頭收費, 更貴, 一年二十幾萬. 以上是以SAP為例, Oracle應該便宜一點.

2. 不滿意: 所謂不滿意來自 SAP & Oracle的顧問都是以第三方顧問為主, 如同前文所言, 這些顧問能否見樹見林, 再說吧! 因此客戶當然不會滿意!!!

2009年6月3日 星期三

[Oracle News] Oracle 進軍小筆電(NetBook) - 併購昇揚後續

就在四月份的文章, 談過 Oracle 併購昇陽對商業智慧和資料倉儲的影響, Larry Ellison又出招了. 果然, Oracle對硬體的興趣越來越濃, 進軍昇陽只是第一步而已. 昇陽的 Java 技術搭配其硬體專長, 進軍目前當紅的小筆電市場是有一定的機會.

小筆電代表的不是只有輕薄短小而已, 它更大的象徵意義是將電腦的使用更加生活化, 讓上網變得更輕鬆更加無處不在. 他的商機也被Larry Ellison 看出來, 因此不讓 Acer(剛推出搭配 Google Andorid的筆電) 和 Asus 等台系廠商專美於前, Oracle也將揮軍前進此市場.

在可攜式(Portable)的平台上執行程式原本就是 Java的專長, 只是近來被 Google和 Apple搶盡鋒頭, 看來昇陽在注入 Oracle的活水後, 是時候在重建 Java 威風了!

2009年5月31日 星期日

[SQL Tune] Hard Parse vs. Soft Parse

Parse 是SQL在執行前的一個重要步驟,也是DBA在調整效能時的一個重要參考指標. Parse可以分為Hard-Parse和Soft-Parse,其介紹如下:

- Hard parse
當 SQL執行時,當Oracle發現在shared pool中找不到相同的SQL時,Oracle就會做Hard-Parse的動作. 他包含以下動作:
* 檢查該SQL的語法
* 檢查執行該SQL的相關權限
* 在shared pool中配置memory給該SQL.
* 做查詢轉換(Query Transformation):當有用到Materialized View時做Table的轉換.
* 最佳化(Optimization):就是產生 Execution Plan,這大概是最耗費CPU的動作.
* 產生執行物件(用VB的講法就是執行檔)
由上面的動作可以知道,Hard-Parse是一個昂貴的動作. 所謂昂貴就是只從Latch的使用到CPU時間的耗用等等.

- Soft parse
相較於Hard-Parse,如果該SQL在shared pool中找到相同的SQL時,Oracle就會做Soft-Parse的動作. 它只會包含前述的步驟1-2. 至於何謂相同的SQL?這時就要瞭解何謂Bind Variable?以下兩個SQL對Oracle來說就是不同的SQL.

select * from X1 where A1='1';
select * from X1 where A1='2';

使用Bind Vriable,才可以將兩句SQL的語法統一如下:

select * from X1 where A1=:X;
:X='1'

至於程式是否使用到Bind Variable則端視應用系統的架構而定,本人服務的公司使用的MES系統是3-tier,但是就是中間層,也就是Application Server並未使用Bind Variable,造成DBA在校調系統時碰到很大的困難. 因為整個系統的延展性(Scalable)很差,導因於每個SQL都被Oracle視為不同的SQL,都要做一次編譯,CPU資源的耗費可想而知.

所以Bind Variable雖然是一個簡單的觀念,卻是開發Oracle應用程式時必要的觀念!

Tom有更精闢的解說在!

2009年5月2日 星期六

[SQL Tune] 用 Oracle Constraint 改善 Query 效能

多數人在 tune SQL 採用的方式多從 Index 或 Join的方式著手. Oracle Optimizer在決定一個 Execution Plan時會有以下的考量:

1. The query to optimize
2. All available database object statistics
3. System statistics(CPU, I/O,..)
4. Initialization parameters
5. Constraints

看到第五項嗎? 原來Constraint也是Oracle在決定Execution Plan時的考慮因素之ㄧ. Constraint對多數人而言是確保資料一致性的最後一道關卡, 但對SQL效能而言也有一定幫助, 且看以下說明:

Constraint --> Check


當SQL遇到 Check constraint時, 若 Check有限制某欄位的值而查詢條件又恰好有該值, 這時Oracle就會根據 Check的限制調整實際SQL的 Execution Plan.

實際範例可參閱Oracle 雜誌 5/6月 Asktom的文章.

http://www.oracle.com/technology/oramag/oracle/09-may/o39asktom.html

這部分在真實狀況下發生的機會較低, 因此不多說明.

Constraint --> NOT NULL

這個情況比較清楚, 就是當某欄位有Index, 但允許空值, 此時空值部份不會被存入 Index中. 但若是該欄位設定為 Not Null, 則當此類SQL(Select Count(*) from Table1 t) 時, Oracle 會很聰明的選取"Index Fast Full Scan"而不用"Full Table Scan", 效能就有一定的提升, 因為該欄位的所有值都對被存入 Index中. 有關"Index Fast Full Scan", 可參閱以下文章.

http://oracle-wei.blogspot.com/2009/03/sql-tune-index-access-methods.html

Constraint --> Primary Key/Foreign Key


這部份對效能有更顯著的提升, 因為 Oracle做的是 Table Elimination, 就是將執行 SQL所需的 Table刪除. 甚麼? 我也是第一次聽到耶! 比較實際的例子用以下說明:

Master Table --> M1 (M_Key, M_Value)

Detail Table --> D1 (M_Key)

有一個SQL如下:
select Sum(M_Value)
from M1, D1
where M1.M_Key=D1.M_Key

可能 Oracle的 Execution Plan是 "Hash Join"就是將 Master和 Detail做 Join後去得到結果.

但如果將 M_Key 加成 D1對M1的 Foreign Key, 而且 M_key為 M1的 Primary Key. 則方才 SQL的 Execution Plan可能會換成只對M1的存取. 因為以實際而言, D1 的存取並不需要, 只是 Constraint確定了這一件事情. 讓 Oracle 放手去做.

不好意思, 偷懶一下這次沒有用自己跑的實例說明, AskTom的說明應該夠清楚也有說服力.

2009年4月24日 星期五

[EDW] Oracle 購併 SUN 對商業智慧&資料倉儲的影響

SUN的購併案在確定由Oracle接收而非IBM後, 市場一片譁然. 多數人還不清楚Oracle為何選擇出手, 因為以硬體而言, 多數的Oracle平台都在HP或IBM的機器,低階的也許是Linux,但是SUN的主力卻是Solaris(Sparc). 既然硬體機會不大,比較可能的著眼點應該就是SUN的Java技術,大家可別忘了SUN才是Java的原創者,雖然目前市場上的Java應用反而以IBM,Oracle或其他應用為主.

Oracle的商業智慧應用有像純以Java開發的Discoverer, 部分應用是用C++和.Net,甚或Hyperion的一些技術. 所以可以想見未來的Oracle商業智慧會越來越往Java平台靠攏和Oracle的WebLogic整合. 還有一個可能是,別忘了,SUN才剛將MySQL納入其麾下,在併入Oracle後,也許一些低階的商業智慧需求,Oracle可以透過MySQL來攻打市場. MySQL的市佔率可不容小覷,因為一堆個人網站因為成本考量,採用MySQL的比率很高.

原文引用: http://www.rittmanmead.com/2009/04/20/oracle-buys-sun-what-does-it-mean-for-oracle-bidw/

2009年4月9日 星期四

[SQL Tune] Pivot/CrossTab SQL Query

開發商業智慧系統時, Crosstab的分析是很重要的技術, 或稱為Pivot. 將資料轉置成欄和列都有各自代表的維度, 而相對應的值就放置在中間, 如下表所示:

外銷總數量
USA China Japan
Jan 100 150 100
Feb 50 20 10
Mar 20 40 50
Apr 10 50 60
...

這對Excel而言是一件簡單的事情,因為樞紐分析大家都會,但是對關聯式資料庫而言,是一個
很大的挑戰, 因為關聯式資料庫的資料擺放型態是 Column-Value, 如下表:
月份        外銷國             數量
Jan USA
10
Feb
China 30
....................................

這時在 Oracle怎麼解決呢? 有些人會在呈現端-Client想辦法, 不管是VB, ASP,
JSP將資料從Oracle讀進ResultSet後,聰明的程式設計師總有辦法將資料作CrossTab
的處理, 但問題是通常程式寫完後如果換做是其他人接手,應該會看不懂程式碼在寫
什麼?原因無他,因為太複雜!還有一個辦法是買 Solution, 像 Hyperion,
Oracle Discoverer, Business Object等應該都內建一些報表工具可以做CrossTab,
缺點不用說就是貴,不用個幾百萬,案子應該起不來!

如果可以在 Oracle端就將資料處理好, 再搭配前端的資料呈現工具,有一些比較簡單
的作法.常見的像是以下的SQL, 用 Decode 或是 Case, 用兩層SQL兜出想要的結果.但
是缺點呢? 一個是寫法還是有點小複雜, 如再要多個法國的外銷數量, 程式還要改.
當然後者的問題好解決,可將此邏輯寫成一個Function, 將可能的國別傳入Function後,
再透過該Function兜出SQL後執行.

=========================================================================
select Month,China,USA,Japan,China
+USA+Japan
from (
select
Month,
max(case when Country='China
' then qty else 0 end) China,
max(case when
Country='USA' then qty else 0 end) USA,
max(case when
Country='Japan' then qty else 0end) Japan
from Sales_Value
group by
Month
);
=========================================================================

OTN有一篇文章
(
http://kr.forums.oracle.com/forums/thread.jspa?messageID=2487130)
就是談這一段,下面是節錄自該文章的Source Code. 原則上就是將要做
CrossTab的相關資訊傳入後,將SQL組合出來,有些語法會有點看不懂,因為程式裡
兜出來的SQL是用11G最新的Pivot SQL.
============================
create or replace function getPivotSql(

p_sql in varchar2,

p_x_col in varchar2,

p_x_col_type in varchar2 default 'DATE',

p_x_col_start in varchar2,

p_x_col_interval in varchar2,

p_x_col_int_unit in varchar2 default 'DAY',

p_x_col_count in number,

p_y_col in varchar2,

p_cell_col in varchar2,

p_cell_col_aggr in varchar2 default NULL

) return varchar2

is

v_sql varchar2(32767);

begin

v_sql := '';

v_sql := v_sql || 'with data as ('||chr(10);

v_sql := v_sql || ' '||p_sql||chr(10);

v_sql := v_sql || ')';

if p_x_col_type = 'VARCHAR2' then

v_sql := v_sql ||', x_dist_values as ('||chr(10);

v_sql := v_sql ||' select distinct '||p_x_col||' val from data order by 1'||chr(10);

v_sql := v_sql ||'), x_values_rownum as ('||chr(10);

v_sql := v_sql ||' select rownum zeile, val from x_dist_values where rownum <= '||p_x_col_count||chr(10); v_sql := v_sql ||')'||chr(10); else v_sql := v_sql || chr(10); end if; v_sql := v_sql || 'select distinct '||chr(10); v_sql := v_sql || ' data.'||p_y_col||','||chr(10); for i in 1..p_x_col_count loop if p_cell_col_aggr is not null then v_sql := v_sql || p_cell_col_aggr||'('; end if; v_sql := v_sql || ' case when '; if p_x_col_type = 'VARCHAR2' then v_sql := v_sql || 'x.zeile = '||i; elsif p_x_col_type = 'NUMBER' then v_sql := v_sql || ' data.'||p_x_col||' between '|| p_x_col_start||' + ('||(i - 1)||' * '|| p_x_col_interval || ') and '||p_x_col_start||' + ('|| i||' * '||p_x_col_interval||') '; elsif p_x_col_type = 'DATE' then v_sql := v_sql || ' data.'||p_x_col||' between '|| p_x_col_start||' + interval '''||((i - 1) * p_x_col_interval )|| ''' '||p_x_col_int_unit||' and '||p_x_col_start|| ' + interval '''||i * p_x_col_interval ||''' '||p_x_col_int_unit; end if; v_sql := v_sql ||' then '||p_cell_col|| ' else null end'; if p_cell_col_aggr is not null then v_sql := v_sql || ')'; end if; v_sql := v_sql || ' as "VALUE"'; if i < p_x_col_type =" 'VARCHAR2'">
============================

下面就來細究Pivot SQL的語法 吧!將前面介紹的第一種方式改寫成新版本會向如下!
============================
select * from (
select Month, Country
from
Sales_Value t
)
pivot
(
count(
Country)
for
Month in ('USA','China','Japan')
)
order by Month;
============================
看起來,簡單多了吧! 結合起第二步驟的Function,CrossTab是不是變成比較簡單有條理
而且彈性變大了? 不用花錢買BI Solution也可以讓公司使用者享有Excel樞紐分析的功能
喔!
OTN原文如下:
http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-pivot.html