Google Search

自訂搜尋

2009年11月30日 星期一

[PL/SQL] Global Temporary Tables - 用途 & 做法

近來碰到一些問題就是在報表開發過程中, 因應需求會撰寫很多SQL而這些SQL可能抓取來自不同的Oracle Database的資料. 但是可能報表要一樣的結果但是不同的人寫就會出現不同的結果, 問題是正確答案只有一個啊. 原因就在前端複雜的schema 設計&流程邏輯, 常常因為開發人員的認知不同而出現落差.

這時如何在架構上讓資料抓取(Data Extraction)和報表呈現(Report Presentation)做有效的區隔就很重要(這邊注重的是資料庫端, 在應用端已有很多方案像Struts等). 就資料庫端而言, 有一個Oracle的技術 'Global Temporary Tables(GTT)' 就有探討的價值. 簡單的說, GTT可以將複雜的資料抓取邏輯隱藏並將結果用報表呈現人員習慣的Table 方式呈現. 另一個重點是該Table的資料只在特定Session中存在, 如果Session結束, 資料即消失, 但是 Table本身還是存在.

下面就來做個測試吧!
SQL> CREATE GLOBAL TEMPORARY TABLE worktable (x NUMBER(3));

Table created.
這時可以在行開啟另一個SQLPlus session, 可以看到方才另一個Session 建的GCC, 並且可以做DML, 如下.
SQL> INSERT INTO worktable (x) VALUES (1);

1 row created.

SQL> SELECT * FROM worktable;

X
----------
1

SQL> commit;

Commit complete.

SQL> SELECT * FROM worktable;

no rows selected

ㄟ!見鬼了, 怎麼一 Commit資料就不見了, 原因在見下面建GCC的參數. 建立GCC時,
用'On Commit Preserve Rows', Commit完後, 資料便不會消失.
SQL> CREATE GLOBAL TEMPORARY TABLE worktable
2  (x NUMBER(3))
3 ON COMMIT PRESERVE ROWS;

Table created.

SQL> INSERT INTO worktable (x) VALUES (1);

1 row created.

SQL> SELECT * FROM worktable;

X
----------
1

SQL> commit;

Commit complete.

SQL> SELECT * FROM worktable;

X
----------
1
這時如果從其他Sesseion看相同的GCC是看不到資料的, 如下.
SQL> SELECT * FROM worktable;

no rows selected
再試試 truncate 吧!

SQL> INSERT INTO worktable (x) VALUES (2)
1 row created.

SQL> commit;

Commit complete.

SQL> SELECT * FROM worktable;

X
----------
2

SQL> TRUNCATE TABLE worktable;

Table truncated.

SQL> SELECT * FROM worktable;

no rows selected

SQL> commit;

Commit complete.
下Truncate指令一樣只會把Session內的資料清除.

2009年8月28日 星期五

[IT Architecture] Oracle 11G VERSUS MS-SQL Server 2008

Oracle 和 MS-SQL 之間的比較已經是不少網友茶餘飯後的話題. 就在 Oracle 11G和 MS-SQL 2008陸續現身後, 一篇新的比較報告可供大家參考! 重點是此報告號稱使用 Oracle一年相較 MS-SQL可省下三萬三千多美元. 報告重點如下:

  • DBA執行常態的資料庫管理功能時, 平均花費時間上來比較, Oracle比 MS-SQL 少掉41%的時間.
  • 就執行步驟而言, Oracle比起MS-SQL少掉43%的步驟, 根據 Edison 的複雜度矩陣研究.
  • 就 DBA的生產力而言, 因為前兩點的貢獻, Oracle的DBA平均可多節省 $33,520.47/每年.
  • 就備份和還原而言, Oracle比起MS-SQL除了架構和功能上的優勢以外, 就操作面而言還少掉53%的時間/60%的步驟.
  • 就效能校調方面, Oracle也比MS-SQl省掉87%的時間.
當然看完這篇報告, 肯定氣死不少MS-SQL的死忠者. 但是公說公有理, 婆說婆有理, 有興趣的人可以從連結的網址找到完整的報告, 也許比較有客觀的評估.

2009年7月4日 星期六

[PL/SQL] 動手開發PL/SQL專案前的第一步

PL/SQL, 這個在 Oracle 世界中最適合做資料處裡的開發工具. 素以執行效率佳, 和 Oracle 整合度高, 開發簡單廣受開發人員喜愛. 但是開發簡單後面的涵義是: 程式開發的品質如何控制? 品質涵蓋的層面很廣, 符合使用者需求, 效能好和程式的可維護性! 這一期的Oracle雜誌,PL/SQL Guru - Steven Feuerstein 發表一篇文章談到,一個PL/SQL開發團隊從哪幾個點切入可以有效控制程式品質和達到使用者需求, 在第一時間就將後續的開發架構架構好!

1. Correct:符合使用者需求
這裡談到的是正確性,所謂正確性就是正確的達到使用者的需求,當然一大半是需求&系統分析的事情,這裡Oracle管不著. 但是使用者的需求瞭解後,開發人員如何確定程式有做到該做的事呢? 單元測試在當中扮演一個重要的角色,多數開發團隊會要求開發人員在程式開發完後提交單元測試報告,但是單元測試多由開發人員自行定劇本自行測試,涵蓋度和正確度如何無從得知?這時所謂的自動化測試(Automated regression test)就是一個重要的工具. 坊間常見的工具有 utPLSQL, PLUTO, PL/Unit, DBFit, Quest Code Tester. 這些工具的產品網址都在連接中,另外除了最後一個是要錢以外,其他看了都是Open Source的,大家有興趣可以試試! 哪天也要自己的team試試,再將結果PO出來!

2. Fast Enough:效能好
  • Optimizing Compiler
    可參考以下文件有詳細說明. 在10G 後就有這項功能, 主要目的在提升PL/SQL在 runtime的效能. 而做法則是在 compile時, 使用不同的優化(Optimization)手段. 它是透過以下參數去控制,"PLSQL_OPTIMIZE_LEVEL".
  • Bulk processing
    透過此工具, 將原始一筆一筆的處理方式轉換為多筆批次處理. 這篇文章對效能的提升有一些實驗和驗證(該文章號稱有三十倍快).
  • Pipelined table function
    允許不同的 PL/SQL 間的資料傳遞不必受限於僅只傳遞參數而可以傳遞 ResultSet並且不用額外建立Table. 尤其在 ETL程式裡, 資料不必透過實體Table處理而是直接透過 Pipelined table傳遞, 對效能有一定的助益. 可以參考這篇文章.
  • Function result cache
    可以參考這篇文章, 有完整的介紹. 簡短的說, function result cache的好處在, 當主程式呼叫另外的 PL/SQL function時, 這個 PL/SQL function可能含 SQL. 這會造成所謂的 Context Switch和 IO的增加. 因此 function result cache可以透過語法(Create function XXX (I1 varchar2) return varchar2 Result_Cache is) 設定將該 PL/SQL function的結果快取(Cached)起來, 加快處理速度.
  • Native compilation
    參考"Optimizing Compiler"的文章, 所謂 Native Compilation就是將PL/SQL編譯成 C語言, 直接和Oracle整合, 效能較佳.
3. Maintainable:程式的可維護性
  • Naming conventions & Syntax standards
    變數和程式名稱的命名規則應該都要有文件作規範.
  • Writing SQL in PL/SQL
    SQL的產生應該有一個獨立的Data Access Layer而不是任由開發人員在PL/SQL中 Hardcode. 透過這個Layer, 將SQL的複雜邏輯隱藏起來,以利後續的維護和開發.
  • Error Management
    統一的 Error Handling 機制和模組.
  • Application Tracing
    統一的tracing 機制和模組,可參考文章.
  • Version control and backups
    版本備份, 我的團隊是用 Daily 從 Metadata中備份PL/SQL至檔案中, 以利未來查詢之用.
上面談的規矩都是規矩, 開發人員是否遵守又是另外一件事情?這時候適時的 Code review是有必要的,確認開發人員有確實遵守規定.
在你組成PL/SQL開發團隊前, 可以將上述的建議當成 Check List來確認開發團隊是否可以正確開發出快速且維護性高的系統.

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

2009年4月4日 星期六

[Oracle News] Oracle 有趣的東東

幾個和Oracle相關而且有趣的東東和大家分享. Firefox兼Oracle的喜愛者有福了.

  • Oracle文件搜尋的Firefox plugin, 可以在Firefox上新增搜尋Oracle文件的搜尋引擎
  • Oracle 新聞搜尋, 可以讓你隨時了解Oracle的最新新聞.
  • Oracle Bookmarklets, 這是一個Javascript, 只要將網址加入Bookmark後, 連結該網址就可以搜尋文件.
  • 測試你的 Oracle功力的小遊戲, 看看你過幾關?

2009年4月3日 星期五

[PL/SQL] Oracle SQL 批次Update,如何確保完整性?

Oracle SQL 批次Update如何確保完整性,對很多人來說是一件很麻煩的事情.當一個Update指令失敗,程式會立即跳離並Rollback已經更新的資料. 但多數的狀況是,造成失敗的資料只是上千筆資料中的一兩筆而已,其他沒有問題的更新應該還是要繼續執行. 這時要如何處理呢?Oracle magazine 3-4月號提供了三個Solution供大家參考. 大家看看吧!

1. Nested Block: 這是一般人做常用的作法,就是將Update指令寫成Cursor,一筆一筆擷取處理 後再做單筆的更新,並將整個過程用Begin-Exception-End包裹起來,當有Update失敗的情形 時用Exception處理,以確保後續的更新得以繼續進行. 這樣的好處是邏輯很清楚,有問題時很好處理但是問題來啦,當資料量大時,效能是必有問題. 另一個好處是多數的Oracle版本都可支援此作法.

2. ForAll Save Exceptions: 這個作法就是針對第一個方式的效能問題作改善.
利用 Bulk Collect Into的功能將資料從Cursor放置入變數後, 再做批次資料更新. 更新時多一個 'Save Exceptions'的指令,這時程式會將過程中的更新錯誤資料存入於宣告區的Exception變數中,之後再將其存入Table以供後續Trouble shooting之用. 使用'Save Exceptions'指令,Oracle會將已執行的DML Rollback並將錯誤訊息存入SQL%Bulk_Exceptions中,並繼續執行下一個指令. 但是這時被Rollback的資料會包含同一個Statement已經執行的Update.
這一段比較複雜,節錄原文裡的部分Source code以供說明.
從Code裡面看到作者是用他自行開發的QEM(PL/SQL Error Management Framework) 來記錄Exception中的詳細資訊.

======================================================================
CREATE OR REPLACE PROCEDURE change_salary_for (
dept_in IN employees.department_id%TYPE
, pct_increase_in IN NUMBER
, fetch_limit_in IN PLS_INTEGER
)
IS
bulk_errors exception; PRAGMA EXCEPTION_INIT (bulk_errors, -24381);

CURSOR employees_cur
IS
SELECT employee_id, salary
FROM employees
WHERE department_id = dept_in;

TYPE employee_tt
IS
TABLE OF employees.employee_id%TYPE
INDEX BY BINARY_INTEGER;

employee_ids employee_tt;

TYPE salary_tt
IS
TABLE OF employees.salary%TYPE
INDEX BY BINARY_INTEGER;

salaries salary_tt;
BEGIN
OPEN employees_cur;

LOOP
FETCH employees_cur
BULK COLLECT INTO employee_ids, salaries
LIMIT fetch_limit_in;

FOR indx IN 1 .. employee_ids.COUNT
LOOP
salaries (indx) := compensation_rules.adjusted_compensation (
employee_id_in => employee_ids (indx)
, pct_increase_in => pct_increase_in
);
END LOOP;

FORALL indx IN 1 .. employee_ids.COUNT
SAVE EXCEPTIONS
UPDATE employees
SET salary = salaries (indx)
WHERE employee_id = employee_ids (indx);
EXIT WHEN employees_cur%NOTFOUND;
END LOOP;

EXCEPTION
WHEN bulk_errors
THEN
FOR indx IN 1 .. sql%BULK_EXCEPTIONS.COUNT
LOOP
q$error_manager.register_error (
error_code_in => sql%BULK_EXCEPTIONS (indx).ERROR_CODE
, name1_in => 'EMPLOYEEE_ID'
, value1_in => employee_ids (sql%BULK_EXCEPTIONS (indx).ERROR_INDEX)
, name2_in => 'PCT_INCREASE'
, value2_in => pct_increase_in
, name3_in => 'NEW_SALARY'
, value3_in => salaries (sql%BULK_EXCEPTIONS (indx).ERROR_INDEX)
);
END LOOP;

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


3.DML Error Logging: 這一段是一個新的作法,先用以下Package DBMS_ERRORLOG為你要處理的Table建立一個相對應的Error Log Table.
BEGIN
DBMS_ERRLOG.create_error_log (
dml_table_name => 'EMPLOYEES'
, skip_unsupported => TRUE);
END;


執行完後會有一個新Table出現 "ERR$_EMPLOYEES". 這時程式如第二個方式的Bulk Collect
Into的方式但是Exception的處理使用不同的作法. 如以下的程式碼,當有Exception發生於
Update的時候,程式碼裡面將上"LOG ERRORS REJECT LIMIT UNLIMITED;"指令,再呼叫副程式
Log_Error,這時就可以使用方才建立的Error Table將錯誤輸出而且不會影響後續的DML處理.
這裡的Rollback就是根據每一筆記錄不同於第二個作法的是每一個Statement.

======================================================================
PROCEDURE change_salary_for (
dept_in IN employees.department_id%TYPE
, pct_increase_in IN NUMBER
, fetch_limit_in IN PLS_INTEGER
)
IS
bulk_errors exception;
PRAGMA EXCEPTION_INIT (bulk_errors, -24381);

CURSOR employees_cur
IS
SELECT employee_id, salary FROM employees WHERE department_id = dept_in;

TYPE employee_tt
IS
TABLE OF employees.employee_id%TYPE INDEX BY BINARY_INTEGER;

employee_ids employee_tt;

TYPE salary_tt
IS
TABLE OF employees.salary%TYPE INDEX BY BINARY_INTEGER;

salaries salary_tt;

PROCEDURE log_errors
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR error_rec IN (SELECT * FROM err$_employees)
LOOP
q$error_manager.register_error (
error_code_in => error_rec.ora_err_number$
, name1_in => 'EMPLOYEEE_ID'
, value1_in => error_rec.employee_id
, name2_in => 'PCT_INCREASE'
, value2_in => pct_increase_in
, name3_in => 'NEW_SALARY'
, value3_in => error_rec.salary
);
END LOOP;

DELETE FROM err$_employees;

COMMIT;
END log_errors;
BEGIN
OPEN employees_cur;

LOOP
FETCH employees_cur
BULK COLLECT INTO employee_ids, salaries LIMIT fetch_limit_in;

FOR indx IN 1 .. employee_ids.COUNT
LOOP
salaries (indx) := compensation_rules.adjusted_compensation (
employee_id_in => employee_ids (indx)
, pct_increase_in => pct_increase_in
);
END LOOP;

FORALL indx IN 1 .. employee_ids.COUNT()
UPDATE employees SET salary = salaries (indx) WHERE employee_id = employee_ids (indx)
LOG ERRORS REJECT LIMIT UNLIMITED;

log_errors ();

EXIT WHEN employee_ids.COUNT() <>======================================================================

原文引用,請參照Link.

2009年3月31日 星期二

[APEX] 讀書心得 - Part I (Application Builder Concepts)

花了三天時間終於完成了第一個應用系統, 內含收貨資料維護, 出貨資料維護和出貨庫存報表. 其中出貨資料維護是用 Master-Detail的 Form去設計. 使用後的感覺是, Schema也就是Table/Index/...的建立還是要透過APEX的畫面自行設計&建立, 懂關聯式資料的人都可以上手. 之後進到WEB畫面的建構部份才是真正的挑戰. 如前文所提, 我也K了不少文件和安裝範例程式來看, 總算完成第一個應用程式(正請老婆大人驗收中).
感覺是APEX的底層設計考慮不少Layer的觀念很像Java 的 MVC(Model & View & Control)觀念, 所以有些設定要想一下他的原理才能夠瞭解, 知道如何修改.
下面是我K了官網上的文件後, 先將整個WEB產生的架構整理如下, 看一下在去K厚厚的原文書會比較有幫助.







.

Item #ItemSub ItemDescription

.

1.1PagePage"the basic building block of an application,contain user interface elements, such as tabs, lists, buttons, items, and regions."

.

1.2PagePage Rendering"lists user interface controls and logic that are executed when a page is rendered. Page Rendering is the process of generating a page from the database
Show Page is the page rendering process. It assembles all the page attributes (including regions, items, and buttons) into a viewable HTML page."

.

1.3PagePage Processing"Lists logic controls (such as computations and processes) that are evaluated and executed when the page is processed.
Accept Page performs page processing. It performs any computations, validations, processes, and branching.
When you request a page using a URL, the engine is running Show Page. When you submit a page, the Application Express engine is running Accept Page or performing page processing during which it saves the submitted values in the session cache and then performs any computations, validations, or processes."

.

1.4ConditionConditionA small unit of logic that helps you control the display of regions, items, buttons, and tabs as well as the execution of processes, computations, and validations.

.

1.4.1Condition TypeCurrent page in Expression 1"3,100,203
If the current page is 100, then this condition evaluates to true and the condition passes."

.

1.4.2Condition TypeExists (SQL query returns at least one row)"SELECT 1 FROM employees WHERE department_id = :P101_DEPTNO"

.

1.4.3Condition TypePL/SQL ExpressionNVL(:MY_ITEM,'NO') = 'YES'

.

1.5Session State ManagementSessionA session is a logical construct that establishes persistence (or stateful behavior) across page views

.

1.5.1Session State ManagementReferencing Session State"1. SQL --> :MY_ITEM --> Standard bind variable syntax for items whose names are no longer than 30 characters. Use this syntax for references within a SQL query and within PL/SQL.
2. PL/SQL --> V('MY_ITEM') --> PL/SQL syntax referencing the item value using the V function.
3. PL/SQL --> NV('MY_NUMERIC_ITEM') --> Standard PL/SQL syntax referencing the numeric item value using the NV function.
4. Static text (exact) --> &MY_ITEM. --> Static text. Exact substitution."

.

1.5.2Session State ManagementSetting Session StateWhen a user submits a page, the Application Express engine automatically stores values typed into fields (items) in session state.

.

1.5.3Session State ManagementClearing Session State"Uses standard f?p syntax to clear the cache
1. Clearing Cache by Item
2. Clearing Cache by Page
3. Clearing Cache for an Entire Application
4. Clearing Cache for the Current User Session"

.

1.6Understanding URL SyntaxUnderstanding URL Syntax"The URL that displays for each page identifies the location of Oracle Application Express, the address of Oracle Application Express, the application ID, the page number, and the session ID.
Using f?p Syntax:
f?p=App:Page:Session:Request:Debug:ClearCache:itemNames:itemValues:PrinterFriendly

.

1.7Substitution StringsSubstitution Strings"You can use substitution strings within a page template or region source to replace a character string with another value. As you design your application and enable users to edit items, you use substitution strings to pass information.
You can use substitution strings in Application Builder in the following ways:
* Include a substitution string within a template to reference component values
* Reference page or application items using &ITEM. syntax
* Use built-in substitution strings to achieve a specific type of functionality

.






2009年3月28日 星期六

[APEX] 學習計畫

就在找到APEX的免費開發平台後, 下一步當然是要趕快上手. 第一個目標是幫老婆的網拍事業建立一套簡單的進銷存的管理系統, 也讓身為大股東的我知道到底老婆賺了多少錢. 下面是我目前計畫中的學習來源

1. APEX 原文書
  • Pro Oracle Application Express : 這本比較進階比較適合有點觀念或開APEX發經驗. 小道消息是這本書去對岸的網站搜尋一下應該找得到PDF版本, 不過有幫助還是買原版吧.
2. APEX 官網文件

下面是官網上提供的文件, 應該是很完整啦!
==============================================================
3.2 Release Notes HTML PDF
Installation Guide HTML PDF
2 Day + Developer's Guide HTML PDF
Application Builder User's Guide HTML PDF
Migration Guide HTML PDF
Administration Guide HTML PDF
SQL Workshop and Utilities Guide HTML PDF
API Reference HTML PDF
Advanced Tutorials HTML PDF
Full Library HTML














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

3. 部落格
當今學東東當然要上BLOG, 而且用Goolge Reader看更是方便. 直接到官網下載OPML檔案後
再import進 Google Reader. 就有一堆看不完的文章可供參考.

4. 官網的SAMPLE 應用程式
官網裡有提供一些現成的應用程式, 像是Asset management, Issue Tracker等. 下載下來後, 只要Import進去開發平台後, 就可以從實際的例子了解是如何做設定. 值得一提的是從官網下載下來的就是一個.SQL檔案, 代表說真正Import進去的就是一堆設定而已, 而沒有程式碼.

好啦! 我的進銷存的進貨以完成, 銷貨還進行中. 因為對APEX的一些細部設定掌握度不高常常會卡住. 不過等熟悉後, RAD(Rapid Application Development)的好處就會顯現出來, 不用寫程式就可以開發出WEB系統, 酷吧!!!

2009年3月26日 星期四

[APEX] APEX 免費應用開發平台

就在對APEX做了一番研究之後, 卻苦無開發平台(我家裡的NB有裝 Oracle XE & APEX, 但是想要用還要動一些手腳有點小麻煩)可供發揮. 這時發現原來 Oracle 有提供一個平台供開發人員在上面開發程式, 建立 Table等等. 開發出來的應用程式也可以供其他人使用. 但是因為它的目的是為了推廣APEX所以不允許在上面存放重要資料, 當然會有一些Quota的限制. Oracle可以這樣做一個重要的原因是因為它整個開發介面都是架構在WEB上的.

為了使用這個平台, 可以先下以下網址(http://apex.oracle.com/i/index.html), 申請一個帳號, 還要經過Oracle審核後發MAIL通知密碼後幾可使用. 應該是真的會審核吧! 因為一開始申請完等半天都收不到MAIL,大概過了兩天後才收到含密碼的MAIL,還以為是MAIL出問題. 下面就是都入的首頁畫面.

哈哈! 可以上工啦! 不管在哪裡都可以開發系統而且好了以後還可以秀給朋友看看! 不錯吧!

趕緊一起來試試這個RAD(Rapid Application Development)的好咚咚吧!


2009年3月19日 星期四

[Content Management] Oracle Content Service Study

最近公司的年度計畫之一談到的是客戶服務的加強,但幾位客服同仁們好像也想不到什麼好主意. 畢竟這個艱困的年代,留住客戶是第一要事. 就在這時撇見競爭對手的網站上,既然搶先一步提供了Oracle iFS的服務. 突然想起進來幾家客戶都有類似的需求,就是提供檔案的分享服務. 也就是不要透過傳統的MAIL或是FTP共享空間的方式來作為協同合作的文件交換平台.

這時就想到我們家也有機會導入Oracle iFS來加強客戶服務提升溝通效率. Oracle iFS 到了10G已經被整合成了Oracle Collaborative Suite(協同作業),旗下包含了
  • Oracle Content Services:Oracle 內容服務是Oracle 協同作業中文件檔案和內容管理套件.
  • Oracle Mail:Oracle 郵件通過將所有消息(包括電子郵件、語音郵件和傳真)存儲在單一的Oracle10g 資料庫中,提供了一個真正統一的企業訊息傳遞基礎架構.
  • Oracle Calendar:Oracle 日曆為現代企業而開發功能強大的時間管理產品.
  • Oracle Discussions:Oracle 討論區使得使用者方便張貼有關某個具體主題的訊息和問題,共享其答案和意見.
  • Oracle Real Time Collaboration:Oracle 網路會議立即線上會議搭配會議白板更可將所有會議紀錄錄音錄影,成為日後最佳教育訓練方式.
  • Oracle Messenger:Oracle 即時訊息 (企業內部資訊傳達更容易及更安全).
  • Oracle Workspaces:Oracle 工作區使用者可共享文件檔案、保存討論、管理會議和任務.
重點回到 Oracle Content Service, 前身是iFS. 其實說穿了就是BLOB,沒記錯BLOB就是將檔案儲存在Database裡面(檔案儲存在Database裡面對查詢和管理當然有很大的幫助),再透過Oracle Application Server將檔案透過WEB和類似檔案總管的型態呈現給使用者. 這中間當然要有很好的權限管理機制,加上檔案版本的管理(Check In/Out). 透過這樣的機制,傳統上的MAIL和FTP的溝通平台應當會有很大的改善. 好啦!趕快去KK文件和邀幾家Vendor來Survey看看是否真得可行吧!

2009年3月17日 星期二

[APEX] 安裝 APEX 3.2 in Oracle 10g XE

APEX(Oracle Application Express)是Oracle用來取代Oracle Form和HTML DB的下一世代產品,他是架構在Meta-Data上面的開發架構,簡單的說,Oracle試著讓你不要寫程式也可以快速開發出一些實用的WEB應用程式,也稱為宣告式開發(Declarative Programming).

APEX 官方網站
http://www.oracle.com/technology/products/database/application_express/index.html

下面是來自Oracle官方對APEX的簡單介紹.
=========================================
Oracle Application Express (Oracle APEX), formerly called HTML DB, is a rapid web application development tool for the Oracle database. Using only a web browser and limited programming experience, you can develop and deploy professional applications that are both fast and secure. Oracle application express combines the qualities of a personal database, productivity, ease of use, and flexibility with the qualities of an enterprise database, security, integrity, scalability, availability and built for the web. Application Express is a tool to build web-based applications and the application development environment is also conveniently web-based. Watch this Application Express Positioning flash demonstration and then try Application Express simply by signing up for an account at apex.oracle.com.
=========================================


我的Laptop上已經有Oracle 10G XE,APEX3.2也在日前Release,今天花了點時間把APEX安裝起來,順道在APEX官上網下載了資產管理的範例,也安裝起來,執行的結果如下圖. 之後就可透過APEX提供的功能去修改功能,或新增報表,不用再寫程式喔!


APEX我還不太熟,用這個當起點學學,未來有機會在來Share. 據說著名的Oracle Asktom網站也是用APEX開發的,個人覺得挺有未來空間的.

2009年3月13日 星期五

[EDW] Enterprise Data warehouse - Star Schema

Enterprise Data Warehouse的架構中,Star schema是最常使用的Schema設計概念, 又稱為Dimensional Modeling. 它的精神就是將商業流程用一個一個星星(STAR)去代表,舉例而言,STAR像是營收,但看營收又會根據月份,產品別等維度來看. 維度就是Dimension. 所以Star Schema的設計就是透過分析商業流程將ERP, MES等前端系統的資料將其轉置為Fact和Dimension Table. 後續在做資料呈現時,不論是WEB或其他報表工具,透過Star transformation從ORACLE擷取資料,這也是ORACLE官方建議的作法. 這裡就談一下Star Schema這個概念,主要是從以下書籍(data warehouse design solution)和WIKI而來.

定義

Star schema 由 WIKI-fact tables (通常只有一個) 和其引用到的多個 WIKI-dimension tables所組成.

運作模式

談Data warehouse常常會和OLTP系統相比較. 所謂OLTP就是由一系列的Event和Transactions所組成配合OLTP正規化的基本設計精神. OLTP正規化的目的是確保資料的一致性和減少資料重複儲存. 但是在這個架構之下,當要回答前述如二月份某產品的營收有多少時?OLTP系統通常無法快速提供答案,原因也正如前所述,因為正規化,一個如上簡單的問題對OLTP系統可能要下一個SQL連接五六個Table. 正因為這樣的問題,Star Schema孕育而生.

以上為例,營收資料在Star Schema中就叫Measure, Measure可能包含營收金額,出貨數量,毛利率,發票號碼等,而擺放Measure的Table就叫Fact Table. 而這些Measure如何被商業人員查詢,查詢的進入點就叫Dimension. Dimension可能包含出口國家,產品別,銷售客戶,銷售日期等等.

EDW設計人員在將商業流程分析後,產生所謂的Measure和Dimension後,進入Table設計階段. 如以下的一個STAR範例.



Fact Table除了包含主要Measure資料外,還會有包含連接到Dimension Table的Foreign Key. 而Dimension Table則由Dimension key(Primary Key)和屬性(Attribute)所組成.

如這個例子,Fact是 由Measure-Unit_Sold和三個Dimension Key(Store_ID,Product_ID,Date_ID)所組成. 而每個dimension table都有一個 primary key和相關的屬性,如日期,週別,商店州別等等屬性. 所以當要查詢某品牌某商店的賣出數量時,使用以下SQL可以得到答案.

        =================================================
SELECT
P.Brand,S.Country, SUM (F.Units_Sold)
FROM Fact_Sales F INNER JOIN Dim_Date D ON F.Date_Id = D.Id
INNER JOIN Dim_Store S ON F.Store_Id = S.Id
INNER JOIN Dim_Product P ON F.Product_Id = P.Id
WHERE D.Year = 1997
AND P.Product_Category = 'tv'
GROUP BY P.Brand, S.Country;
===================================================

Fact Table
在設計Fact Table時要特別注意的是所謂的細度(Grain),所謂細度就是Fact Table中的每一筆
記錄,都擁有一樣的細度. 以上面的例子而言,Fact Table的每一筆資料都屬於同一張發票項目
(Item). 這個意義代表前端ERP系統的發票項目一定是同一Store,Date和Product,如此資料才能
被正確從ERP轉換至EDW,EDW也才能正確呈現資料.

Dimension Table
如前所述,Dimension Table由Dimension Key和 Dimension Attributes所組成. 作者特別強調在
這裡要儘量避免將Table作正規化,因為一旦做正規化,查詢效能會大受影響.

MDB
Star Schema通常發生在關連式資料庫中,但也有像Business Object, Hyperion, Teradata等廠
商有他們自己專用的多維度資料庫(MultiDimensional Database),又稱為Cube. 這些Cube搭配
這些廠商專用的資料呈現軟體, 通常可以很快速的將資料呈現出來,而且還可以做類似EXCEL的
樞紐分析. 但是也有限制,就是資料量的大小有限制. 這也是將Star Schema推導在關連式資料
庫的目的去移除資料量的限制.

下文再看看更多Fact/Dimension Table設計的技巧.

2009年3月7日 星期六

[SQL Tune] 評估 Index 存取方式(Access Methods)

Index 的建立不論是B-tree, Bitmap還是 function-based index, 都是加快資料存取的手法. 簡單的說, Index 有點像是建立資料的捷徑, 而這個捷徑就是RowID.所以 Index存取的目的就是去蒐集RowID, 藉此捷徑快速的取得資料.

常見的Index存取有以下幾個方式

  • Index Range Scan
    這是最常見的存取方式, 從以下SQL可以清楚瞭解.

    select
    employee_name
    from employee
    where Birth_date >sysdate-100;


    Birth_date這個欄位若有建立Index, Oracle透過 B-Tree Index 找到Rowid後, 即可快速找到資料.

  • Fast Full-index Scan
    Full index scan 乍聽之下會不清楚Oracle在搞甚麼? 和 Full Table Scan有何不同? 其實是因為有些SQL只需要Index的資料根本不需要碰到 Table的資料, 像 Count(*), 如以下SQL.

    select distinct country, count(*)
    from employee
    group by country;

    如同 Full-Table Scan, Fast Full-Index Scan也會參考 db_file_multiblock_read_count的參數. 也就是當Fast Full-Index Scan發生時, Oracle也會一次根據此參數設定讀取多個Block.至於 Oracle 是否執行 Fast Full-Index Scan, 前提是 所有在 select 和 where中指定的欄位都 必須存在於 Index中.另外必須有多於 10%回傳的資料是位於Index中, Optimizer才會選擇使 用. 也可以用這個 Hint(/*+ index_ffs() /*)去強迫 Oracle執行Fast Full-Index Scan.
  • Index Full Scan
    通常發生在Optimizer認為SQL回傳的結果會按照Index排序,也就是有 'Order By'的指令. 它會用 Temp space料對Index做排序. 和 Fast Full-Index Scan不同的是, Fast Full-Index Scan是對整個Index做Scan並不會做排序. Index Full Scan使用的是DB Sequential Read而Fast Full-Index Scan使用的是DB Scattered Read.
參考資料
http://www.oracle-training.cc/oracle_tips_index_access.htm
http://www.dbanotes.net/Oracle/Index_full_scan_vs_index_fast_full_scan.htm

2009年3月4日 星期三

[ERP] SAP- 不景氣時代,IT價值的提昇- 心得

2/26有幸參加SAP研討會 "不景氣時代,IT價值的提昇心得", 不景氣年代談的東西當然要和不景氣有點關係. 以下是一些心得報告.
  • SAP 將它本身複雜到連SAP Sales都有點困惑的產品版本整合成 Business Suite 7.0, 包含ERP, PLM(Product Lifecycle Management),CRM(Customer Relation Management),SCM(Supply Chain Management)和 SRM(Supplier Relation Management), 整個架構整合在 NetWeaver的平台上. 另外在SAP在併購 BI 產品 Business Object後也將其整合成 Business Information Platform, 涵跨EPM(Enterprise Performance Management).
  • Business Suite 7.0有一個模組是 GTS (Global Trade Service) 就是有關進出口保稅相關的功能. 這一部分多數台灣導SAP的客戶應該都是採外部系統或SAP外掛方式處理, SAP現在終於有方案, 只是不知是否合適台灣環境.
  • SAP CRM 強調的是使用的方便性和百分之百的WEB介面.
  • SAP 電子簽核方案, 目的在減少紙本簽核和加強簽核效率. 此功能整合了 Interactive Adobe form, 也就是可以離線簽核. 好處在於, 一些食古不化的高階主管, 電子簽核系統在強大, 就是不願意上系統簽核, 一定要看到紙本. 這時可以使用Interactive Adobe form, 讓他有用紙本簽核的感覺, Review完後, 按下PDF上的Submit, 資料可以透過 Netweaver更新回SAP. 在SAP做電子簽核有一個好處就是減少系統間的介面, 因為多數企業資料還是置於ERP內部. 這對IT人員可說是一大福音, 減少很多介面維護的問題.當然SAP令人望之生畏的License收費, 可能會讓很多人對這個東西打退堂鼓.
  • SAP在使用者介面上除了傳統的SAP GUI, WEB的介面也為人熟知, 另外就是Mobile的介面, 看來也做得不錯.
  • 這次主要想聽的是SRM但是著墨不多有點小失望.
看看SAP的這些功能, SAP應該花了不少銀兩在研發這些產品上, 雖然SAP主力還是在ERP, 後續這些ERP以外的功能在台灣推展的情況有待觀察. 企業界對在整合性(Total SAP Solution)和成本考量(High license fee)兩個端點間要好如何拿捏, 是一門學問.

2009年2月27日 星期五

[Oracle News] Oracle Application Grid

Oracle 在併購 BEA Weblogic後終於有大動作了, 配合9i強調的 Database Grid, 這一次推出的是Application Grid. 重點一樣是在強調計算效能的分享(Sharing & Pooling)和現在最ㄏㄤ的雲端運算有異曲同工之妙. 整個架構重點在Fusion 中介軟體(Middleware ), 包含以下元件:

  • Oracle WebLogic Server: 最強大的Java運算平台, 內建clustering功能. 此外, 相關診斷和記憶體leak偵測功能也都具備. 如同大家對 Application Server的印象, 它提供該有的功能.

  • Oracle Coherence: 針對記憶體快取需要提供一個平台, 可以橫跨Java, .NET, and C++ .

  • Oracle Tuxedo: 提供一個平台去整合以C, C++, and COBOL開發的mainframe應用系統. 讓這些舊酒可以用SOA等新瓶來包裝.

  • Oracle JRockit: Java runtime技術去觀察, 管理,並減少記憶體leaks.

  • Oracle Enterprise Manager:提供整個Application Grid一個集中的管理平台和介面.

[IT Architecture] Oracle ILM- Information Lifecycle Management

針對過期資料做備份對資訊人員來說應該是天經地義的事情, 主要有以下三個考量

- 資料庫的效能考量: 純就 Oracle而言, Table 資料不做 purge, 放任成長, 對效能一定有影響.

- 成本考量: 一般資料多儲存於SAN, 儲存媒介所費不貲, 將過期的資料移儲至相較便宜的媒體, 對成本有一定的幫助

- 法律的相容: 所謂法律指得是像沙賓SOX, GLB and HIPAA 等規範對企業資料的保留期限的要求.


這方面的管理擴大到整個企業來說就是所謂的ILM(Information Lifecycle Management), 管理資料的整個生命週期:從抓取、創造、保留、備份、到銷燬資料的整個過程,以低成本的方式儲存大量的資料,還要能易於取得,且必須符合沙賓、HIPPA等法案所規定的資料保存與保護的需求.


ILM很自然的成為IT人員再開發系統之外另外一個要考量的重點. 但以現行企業多數的作法是根據應用系統的特性, 如果是套裝系統如SAP, 本身就有考量到資料備份(Archive), 則就使用SAP提供的Archive工具搭配合適的媒體管理工具(Media)就可以做到ILM. 而若是企業自行開發的軟體, 則多由資料庫端做 Archive. 由開發人員提供TABLE的設計邏輯, 將備份邏輯用PL/SQL(當然C或VB等語言也可以, 但是PL/SQL對資料處裡的效能最好)開發好後, 加入排程後, 將資料定期備份成檔案後由DBA將資料燒錄成光碟. 當然執行細節各家做法又會有差異. 而當使用者有查詢歷史資料需求時, 在請DBA從光碟中將資料回復提供使用者查詢.


從以上的流程可以看到得是, 整個過程有太多人為的作業, 出現問題的風險不低. 本人服務的公司就曾出現客戶端要求查閱三年前的生產資料, 但是DBA回應資料不知道再上述的哪一個環節出問題所以無法找到該資料. 真得是哪裏死的都搞不清楚?


Oracle對這個問題的解法就是ILM. 在Oracle 9i時代, Oracle的作法是在它的HTML-DB(現已改名為APEX)上開發一個做 Data Archive的應用程式包含以下功能

  • 提供一個GUI介面去管理整個ILM環境

  • 定義ILM各個階段的目的.

  • 定義資料備份的規則後產生相關的Script.

基本上功能有但是都很陽春, 隨著 Oracle的版本演進和外在環境變化(主要是儲存媒介- 硬碟的成本下降), 11G 引進的一些新功能.

到了 O
racle 11g, ILM做了大幅度的修正, 整個流程的涵蓋度比起9i來說, 完整了很多, 主要在和儲存端的結合. 在技術上它整合了 partitioning, 允許資料的備份使用 partition-level的相關語法, 這對DBA而言是一個好消息.
  1. 定義要做archive 的資料類別(Define the Data Classes): 簡單得說就是定義Table的重要性, 資料保存的期間, Table用哪一個欄位(Create_date,...)來判斷資料的新舊,..等等.

  2. 建立儲存層別(Storage Tiers): 將資料根據存取的頻繁程度, 以下四個Level, 由上而下分別代表存取頻率由高至低. 舉例,一個Table的資料在資料類別定義後, 根據儲存層別不同會被儲存在不同的層別. 最新的資料儲存在'Ihgh Performance'層別, 以此類推. 這時Partitioning就派上用場, 如何將第一步的資料類別指定給儲存層別就是透過Partitioning.
    High Performance
    • Low Cost
    • Online Archive
    • Offline Archive (optional)

  3. 建立資料存取政策(Data Access and Migration Policies): 這邊就是定義資料如何被搬移和後續存取的權限管理.

  4. 定義規範(Define and Enforce Compliance Policies): ILM的實施一部分是法律的規範, Oracle也將相關規範整合入系統, 以利後續管理目的.

透過11G的一些新功能如前文所提到的加上資料庫壓縮等功能, 整個ILM在11G有了新面貌, 當然Oracle的對手也不留情的抨擊Oracle的ILM視野太狹隘(ILM多由硬體儲存廠商提出為多, 構面不侷限於資料庫), 但是對資料庫來說, Oracle能夠提出Solution並內崁於DBA平日的管理工具中, 對賴資料庫維生的多數系統開發人員來說當然是佳音一則.

參考文件:

http://www.dba-oracle.com/t_11g_ilm_information_lifecycle_management.htm


http://www.zdnet.com.tw/news/software/0,2000085678,20127191,00.htm

2009年2月24日 星期二

[PL/SQL] Oracle 11G SQL/PLSQL New Features

自從Oracle 11g 2007年 release以來, 不斷有一些新的功能被提出討論. 11G的重點在DBA管理工作的自動化, 這使得DBA有時間去做一些更有附加價值的事情而不是聚焦在重複性的資料庫維護動作. 而對開發人員, SQL和PL/SQL則是另外一個重點, 本文介紹一些新的功能和筆者的想法, 順道將網路上其他人對這些新功能的介紹做一些整理.

1. PL/SQL的語法: 新增 "Continue" 關鍵字, 讓它更像C語言. 在迴圈裡面使用"Continue",
讓程式跳過Continue以下的指令而執行下一個迴圈,如此程式碼裡可以少看到很
多"GOTO". 下面是一個例子.

begin
for i in 1..3
loop
dbms_output.put_line(』i=』||to_char(i));
if ( i = 2 )
then
continue;
end if;
dbms_output.put_line(』Only if i is not equal to 2′);
end loop;
end;

結果會長成

i=1 Only if i is not equal to 2
i=2
i=3 Only if i is not equal to 2


2. Stored procedure 的編譯和狀態控制改善

- 除了"Enabled"和"Invalid"以外,多一種Stored Procedure的狀態就是"Disabled".
主要是資料庫管理面上的需要,舉例, 當有Schema改變,程式還沒有要跟著改變時,
可以將程式狀態先行換為'Disabled',此時'Invalid'還是屬於異常狀態,需要特別
處理,而'Disabled'則可以待開發人員確認後再處理.
- Native PL/SQL compiling
所謂 Native就是PL/SQL在編譯後直接產生機器碼並儲存在 System tablespace, 在
執行時也直接進入 shared memory. 而無需透過C編譯器,即所謂的 Intrepreted模
式. 其實此功能在10G即已存在只是聽說在RAC下會有問題,所以11G作了一些改善.
- 減少PL/SQL stored procedure 變成invalidatied的機制
減少因為DDL而導致程式變成 Invalid的機會.

3. 新的轉置SQL"PIVOT"語法
在Oracle要作轉置基本上可行但是要對SQL動很多手腳, 下面就是一個實例,可以看到SQL裡
面用了一些max, decode,sum等指令,有點小麻煩.
select sum("10") "10",sum("20") "20",
sum("30") "30",sum("40") "40"
from(
select max(decode(department_id,10,salary,null)) "10",
max(decode(department_id,20,salary,null)) "20",
max(decode(department_id,30,salary,null)) "30",
max(decode(department_id,40,salary,null)) "40"
from employees
group by department_id
) ;
到了11G你可以這樣做, SQL看起有邏輯而且簡單多了!
select *
from (select department_id,sum(salary) salary
from employees
where department_id > 0
group by department_id)
pivot (sum(salary)
for department_id in (10,20,30,40)
);

4. SQL/PLSQL 的延展性 (Scalibility) : 新的SQL hint /*+result_cache*/   
在SQL中加入此 Hint, 讓SQL的結果被Cached在Memory中而不是Cached讀取的資料在
buffer cache. 針對執行頻繁而且結果較固定的SQL, 使用此HINT對效能應該很有幫助.

5. 改善optimizer收集statistics的效能
Oracle 11g
改善dbms_stats的效能. DBA通常會定期執行此程式收集和更新Statistics,
這個動作多多少少會對database的效能有一點副作用, 這一個改善應可將此
作用降低.

6. SQL execution Plan Management
Oracle 11g 的SPM允許你更進一步控制SQL的 Execution plan,避免系統環境出現異動時,
Execution Plan跑掉.請參閱Link.

參考文件:

http://www.dba-oracle.com/oracle11g/oracle_11g_new_features.htm

http://www.oracle-base.com/articles/11g/PlsqlNewFeaturesAndEnhancements_11gR1.php#continue_statement

2009年2月20日 星期五

[SQL Tune] 新工具(SPM)- 避免 SQL Execution Plan 迷路

很多Oracle的使用者都曾經經歷過以下痛苦經驗:
  • Database升級完之後,某些SQL突然變的慢得不行.
  • Table加了Partition後,本來跑3秒的SQL變成30分鍾也跑不完.
諸如此類不勝枚舉,大致和系統改變有關. Oracle optimizer是Oracle得以強過其他關連式資料庫的利器,但也因為它太過強大, 太過聰明,偶而會秀逗. 當然SQL的Execution plan跑掉不見得是壞事,因為大部分可能變得比較好,例如,資料內容有大幅變動後反映在Statistics上時,這時Execution Plan當然要跟著改變. 這種改變可能是好的改變. 但是如果不是,那就不好了,正式環境的SQL那裡會允許SQL的效能一下子掉得天差地遠. 所以針對Optimizer對Execution Plan的改變,當然只能接受變好不能變差.

在11G之前, 管理 Execution plan的方式是用 stored outline或 SQL profile. 但是這兩個工具相對對DBA而言, 比較需要手動的介入. 相對而言, SPM是smart得多了.

Oracle瞭解大家的痛苦,在11g 出現了一個新功能叫做:SQL Plan Management (SPM),SPM允許使用者針對指定SQL維持一個穩定的效能. 有了SPM後,SQL變成 'Managed SQL' . 所謂'Managed SQL'就是說SPM會針對'Managed SQL'去偵測Execution Plan的改變,為了這個目的,SPM會維護所有'Managed SQL'的Execution Plan歷史紀錄. 這時又有一個 'SPM aware optimizer'負責存取,使用和管理SQL Management Base (SMB)的資訊.

而SMB是負責儲存一組被接受的Plan,而何謂可接受(Accepted)當然要透過SPM去判斷,確定效能沒有問題才能加入SMB. 這樣大概可以瞭解,SPM就是透過將特定SQL的所有Execution Plan儲存起來後,在執行階段去判斷哪一個Plan才是效能最好的. 這時若有一組新的Plan產生,就不會被
'SPM aware optimizer'所考慮因為他還沒有機會進入SMB當中.

下面這個圖說明3個SQL的Plan歷史如何被儲存和被SPM使用.


再來就是要維護一個正確的SMB,有以下幾個方式. 基本上,Oracle在SPM啟動後,它會自動偵測重複性(Repeated)的SQL,將其Execution plan記錄下來,並決定接受與否. 至於非重複性也就是Ad-hoc的SQL就不會被紀錄.
  • 自動偵測: 將參數OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES設為True,此時所有SQL的Plan歷史會記錄Optimizer執行時的相關資訊,例如SQL本身,SQL compile時的環境等. 記錄的資訊未來就可以用來重新產生Execution Plan. 所有該SQL執行產生Plan的歷史紀錄都會被紀錄下來,如果效能被認可,就會被視為可接受.
  • 手動偵測:如果有使用SQL Tuning Set (STS),則SPM也可以手動更新SMB使用以下功能 : dbms_spm.load_plans_from_sqlset 去指定特定的SQL給SMB.
  • 手動偵測:將Cursor cache手動更新SMB,使用以下功能:dbms_spm.load_plans_from_cursor_cache
在SMB建立之後, 每一個SQL在執行之後, 當Optimizer產生一個新的 Execution plan後, 就會和SMB裡面的 Execution plan作比較, 如果有一樣的就直接採用. 如果沒有, 則在SMB裡找一個Cost最低的Execution plan來執行. 而針對未被使用的Execution plan則會被放置到Un-accepted區域. 一直到未來也許環境改變後, 該Execution plan有機會被選取.

至於Execution plan被記錄下來後, 如何管理這裡被記錄且驗證過的Execution plan. Oracle 提供了package DBMS_SPM和 view dba_sql_plan_baseline 供DBA管理之用.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optplanmgmt.htm

[IT Architecture] Oracle Security - Encrypted Tablespace

如之前文章所談,在資訊安全的領域尤其是資料安全是一個備受注目的領域. 現行的企業資料大多存放於關連式資料庫(Oracle是大宗)之中,裡面的資料安全有很多層面在進行保護,不論是透過Database或Application都有很多方案可加強資料安全. 但假想一個狀況,資料在備份到磁帶後,假設磁帶被有心人取得後,只要他有安裝ORACLE並且懂得如何Restore,這些資料不是馬上被看光光. 別擔心,ORACLE早就想到這一點,他的SOLUTION就是- Encrypted Tablespace. 將Oracle的TableSpace做加密的動作後,將加密用的Key另外儲存. 這時就算有心人拿的磁帶拿不到加密Key也是白搭.

Oralce在10G時發表了 TDE(Transparent Data Encryption) Column Encryption,他可以針對Table的特定欄位做加密,但這個作法對效能有一定的副作用,因為被加密的欄位若有Index,其值也同時被打亂,後續的存取因為值已經被打亂變成比較沒有效率. 儘快整個存取過程對開發人員是透明的,就是程式不用作另外處理,但因為效能問題,整個成效被大打折扣.

到了Oracle 11G, 一個新觀念被導進來,就是Encrypted Tablespace. 加密的對象變成整個Tablespace, 有效解決了Column level加密所造成的效能問題. 整個運作過程如下述:
  • 當被加密的資料被選取時,Server Process一樣將資料搬到Buffer cache,然後回應給User Session. 資料在搬到Buffer cache之前就被解密. 所以資料在Buffer cache時已是解密狀態. 這時不管是Index range scan或Join等的動作,因為也運作在Buffer cahce,所以效能的問題就被解決.
  • 後續當資料被寫回磁碟時,DB Writer會再將資料作加密的動作. 也包括 Log writer同樣也會做加密動作.
整個加密的主角在Encryption key,基本上這個key被儲存在Database之外,就是由所謂的External security module管理. 這個External security module需要額外的密碼作管理. 這也是說,儘管有心人拿到儲存資料的Tape,但只要他拿不到這組密碼一樣解不開資料.

資料安全管理不易推動的原因多半不是因為沒有工具,而是工具本身有太多副作用不是對執行效能有影響就是造成管理或程式開發很多額外的工作. ORACLE 11G提供的這個新工具想必吸引很多CIO的目光,讓我們一起看看他未來的發展吧!

[PL/SQL] 讓人吐血的ORA-02046(Distributed Transaction)

今天中午,客訴事件又添一件,人客又在抱怨資料沒產生,給客人看的網站上查不到想看的資料!天啊,這已是這個月來的第N起啦! 工程師查半天,程式就是跑不過,ERROR LOG中滿
滿的 ORA-02046. 這時看起來大勢已去,怒火中燒的客戶又在樓下等資料,腦中滿是問號,突
然靈機一動,將程式移到測試環境再去存取前端ERP的資料(這隻程式是一支ETL,從後端
Data Warehouse資料庫去存取前端ERP的資料庫),莫名其妙的程式就突然跑過了,這時趕緊
將產生好的資料搬到正是環境中,好跟客戶交差(為甚麼測試環境可以過,正式環境不行,至
今未解,但公司的環境因為DBA要求開發人員先行測試即將Upgrade的Oracle版本,所以兩個
環境的版本不一樣,測試環境是9i,正式環境是8i).

但是到底出了甚麼是啊?下面是官方說法:
=====================
ORA-02046:distributed transaction already begun
Cause:internal error or error in external transaction manager. A server session
received a begin_tran RPC before finishing with a previous distributed tran.
Action:none
=====================
看到了嗎? Action是'None',在Google一下,網路上幾乎沒有針對這個問題有提供相關解答.
唯一有正面回應的是,這個ERROR都發生在跨DB存取的動作,可以將遠端要存取的TABLE先
複製回LOCAL端,免除掉DBLINK的動作. 但這個建議相信大多人不會採用,因為就以本公司
為例,相關ETL程式有數百隻,每支都這樣改還得了,況且複製資料還要整體考量Timing的
問題,牽扯實在太大.

那Metalink呢?有沒有解答啊?引用一下http://www.orafaq.com/forum/t/72797/0/的問答
,看看內文提到,metalink也沒有太多解答.

========================================
Actually, quite a few people have sent this error into Oracle, and there are a number of cases
on Metalink about this error, none of them provide much elucidation. So actually, insisting he contact Oracle might not actually do too much good. If so, being able to provide them with a
trace file may help. This is an error that often doesn't throw any alerts.

Basically, what has happened is that the specific server session has received a begin_tran
rpc BEFORE it has finished with a previous distributed transaction.

There is no real clear, set pattern to the conditions that create this error message, and in
many cases, there doesn't seem to be a workaround either.

In one case, the person's application was in autocommit mode and turning that off resolved
the issue. In one case, the error occured in SQLPlus, but not when running the same code in OWB (where the code had been created). In another case, a person said they had increased DISTRIBUTED_TRANSACTION parameter and had it stop. In another case, the problem occured in a jdbc application, but not when the same code was run from SQLPlus.

It has been associated with select statements going from a 9.2.x database to an 8.1.x database.
In most cases, there is a dblink involved, one way or another (buried in a view or somehow). Some reports asscoiate it with insert statements.

In my case, I have been told to write a pl/sql procedure to replace Oracle's multimaster replication. As expected it does an update on a table on a remote database. This update statement causes the error to occur. The earlier version of this procedure, which is as similar
as possible except that it does not use bulk collect to gather the data, does not appear to cause the error to occur.

This is a difficult error and not a lot of information available from metalink. It seems to occur right in the middle of a distributed transaction.
================
=========================

那怎麼辦呢? 工程師嘛,任務就是解決問題,誓死達成任務. 好吧!那就回過頭把問題在定
義得更清楚一點! 底下就是更清楚的問題定義!

問題定義:
一隻每四小時執行一次的ETL程式,每次執行處理的資料量大概是三百筆上下. 主Crusor的
SQL和處理過程中都會不斷透過Database A存取Database B和Database C,最後將結果存於
Database A. 但自從三天前,每次執行此ETL都會撞到ORA-02046的問題,撞到的點都在執
行某副程式時發生,該副程式也是透過Database LINK存取Database B.

問題模擬:
將ETL由背景執行轉成前景執行,執行完後,一樣的ORA-02046出現.
先用以下SQL看看執行前後的Cursor狀態,沒有異常,遠小於Database的設定: Open cursor(Session中可以使用的Cursor, 目前設'10000').
=======================================
select a.name, b.value
from v$statname a, v$mystat b
where a.statistic# = b.statistic#
and lower(a.name) like '%' || 'cursor' ||'%'

NAME                                VALUE
------------------------------ ----------
opened cursors cumulative 26
opened cursors current 9
session cursor cache hits 0
session cursor cache count 13
cursor authentications 1
=======================================

另外一個常見的 Distributed database的問題是參數 'Open Link', session裡所使用的DB
Link總數,看一下目前設定,這個就更不可能超過啦. 重點是若是前述兩個問題,錯誤訊息
也不應該是Ora-02046.

但是同時間也發現,ORA-02046一旦出現,後續所有跨該 DB Link的SQL都會碰到一樣的錯誤訊
息.這時問題既然存在於DB Link,那就看一下 V$DBlink,果然,此View底下的'欄位
'Open Cursors'的值一旦是慢慢變大成9時,討人厭的Ora-02046開始層出不窮. 這個欄位
Oracle的定義是
==========================================================
Whether there are open cursors for the database link
===========================================================

有看沒有懂吧!為什麼這個值一變成9,系統就會拋出Ora-02046,不解!遍尋網路,也沒有更
進一步的解釋.

這時下個指令將DB Link關閉,Ora-02046不再出現.相關跨DB LINK的SQL也可以繼續執行.
====================
ALTER SESSION CLOSE database link A;
====================

但是問題到底怎麼解決啊?看看最近一次程式的Change Log,是在主Cursor的SQL中加了一個
Function,此Function 是存在於Database B,再從Database B中去存取Database A. 先試著
將此Function搬到Database A後,SQL再直接執行呼叫此Function,問題居然解決了. 天啊!
到底是撞倒哪一個參數或限制,至今無解,但和之前談的作法一樣的是:
既然問題發生在 Distributed Transactions,就試著將Distributed Transaction的需求降低
,將跨DB的Function移至Local端.問題暫時解決,未來有機會再將此問題量化來看,看看有沒
有機會看得更清楚問題所在.

也希望ORACLE大人行行好,將此一問題講得更清楚一點,不要只放一個Action='None',這可
讓很多人少掉很多白頭髮耶!

2009年2月10日 星期二

[IT Architecture] 文件安全管理Solution Survey(Part I)

資訊安全的相關議題是身為一個MIS最常被老闆問到的幾個問題之一,尤其是當公司有新的產品接近量產或即將發表,老闆更是會像神經質般找這些不常不太搭理的MIS來,問問資訊安全有沒有SOLUTION,花錢沒關係!好像這些文件隨時都會有公司內部人員會將其外洩似的. 這時MIS就要找一堆VENDOR來,問一堆問題,談一堆需求,然後要報價單. 大夥忙完一陣子把報價和建議案提出來給老闆後, 這時老闆又會說,Proposal寫得不錯但是現在公司狀況不太好,可能先緩一下. 哈哈!這種CYCLE,MIS們是不是都有同感啊? 近來小弟就是接獲類似需求,既然是個CYCLE那就趁這一次把報告弄得完整一點,以被未來不時之需.

0.Wiki定義 :
最近的習慣是做一些SURVEY時先去WIKI看看DEFINITION,避免走偏方向.不過WIKI關於這方面好像不夠深入,我再加了一些東西!

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

信息安全資訊保安有對立的兩方面的含義:一是指作為維護政治穩定的國家的信息安全,一是指最作為人權需要的個人的獲取信息的自由。簡單來講,有關信息安全的內容可以簡化為下列三個基本點:

基於這個原因,任何有違信息的「可用性」都算是違反信息安全的規定。因此,世上不少國家,不論是美國還是中國都有要求保持信息可以不受規限地流通的運動舉行。

對信息安全的認識經歷了的數據安全階段(強調保密通信)、網路信息安全時代(強調網路環境)和目前的信息保障時代(強調不能被動地保護,需要有保護——檢測——反應——恢復四個環節)。

安全技術嚴格地講僅包含3類:隱藏,訪問控制和密碼學。 典型的安全應用有:數字水印屬於隱藏;網路防火牆屬於訪問控制;數字簽名屬於密碼學。

資訊安全的目的在於保護電腦資源,包括硬體、軟體、資料及程式等,以防止不當的變更、破壞及未受權使用;綜合言之,資訊安全管理乃是保護電腦資料隱密性、 完整性與可用性的目的,對電腦系統內的整體架構(包含軟、硬體、作業程序、相關人員等所做的預防措施、災害緊急應變處理原則及復原裝置,以防範電腦資訊遭不當的變更、破壞及為授權使用,促進資訊的正當合理運用)

===================================================================
整個資訊安全的廣義範疇會包括網路安全(防火牆/網路攻擊/駭客攻擊/流量管控/..), 應用程式安全管理(即時通訊管理/郵件管理/應用程式管控/..), 文件安全管理. 另外電腦和通訊資產管理(PC&NB管理/USB管控/儲存設備/..)可說是執行以上管理的基礎工作, 所以一般資安專案也會多少考慮資產管理.
而文件安全的討論則著重在機密性和完整性,舉凡文件的加密(Authentication),適當的人在適當的時刻用適當的方式看到適當的文件(Authorization),文件的增刪改查都被適當的管控等等都是文件安全管理的範疇.

1.名詞解釋:
DRM (Digital Rights Management) :數位內容使用權利管理

2.參考產品:
目前在初步GOOGLE後,SORTING出來的廠家或產品列表如下,睿揚/意藍/喬篷/以柔/博格/數位商業EZ-Lock/微軟/TrustView/錦衣衛/EMC. 主要會針對TrustView和EMC IRM的功能面和架構面做一些評估和大家分享.

2009年2月9日 星期一

[EDW] Oracle 的硬體夢 - HP Oracle Database Machine

連著兩期的ORACLE雜誌都在介紹Oracle和HP聯手推出專門針對Data Warehouse市場的主機. 這一期還是放在封面故事,可見Oracle對此產品的重視. 到底這台主機有什麼魔力,對Data Warehouse又有啥幫助呢?

現在的商業環境越行複雜,決策人員要作分析時所需要的資料維度也比以往更多元,導致資料庫的資料量是以倍數的成長. 這時候,商業智慧軟體如何確定使用者在作分析查詢時的效能不受資料量倍增的影響呢?調整程式SQL當然是一個作法,但參考http://oracle-wei.blogspot.com/search/label/Performance%20Tune, 從底層硬體著手才是王道.

而對資料倉儲而言,效能的瓶頸會在哪裡呢?CPU,MEMORY還是IO?多數人會回答IO,沒錯,資料倉儲的特性就是AD-HDC QUERY一堆,FULL TABLE SCAN更是屢見不鮮,個個都是IO殺手. 對此,Oracle和HP聯手推出一款用八台配備Intel CPU的Database server架構成的Database Grid加上Linux OS還有由14台HP Oracle Exadata組成的Storage Grid. 號稱可提供168 terabyte和14GB per second的資料存取頻寬. 資料存取的改善又來自於InfibiBand的光纖技術大幅加快了Database和Storage之間得存取速度. 看看Oracle怎麼介紹這個產品呢?





那到底Oracle和HP還用了啥麼伎倆呢? 因為硬體誰都會做,上述的硬體花錢不就解決了嗎? Oracle的說法是透過減少資料的傳遞量, 也就是資料在 Database和Storage之間的傳遞. 這個硬體可以將SQL的運算盡可能做在 Storage端, 而非傳統的Database端,也就是說回傳給Database端的不是Data Block而是查詢結果. 如此一來,資料的傳遞量自然大幅下降.

最後一提的是這些設定都是 Pre-Configured也就是客戶不用花太多功夫再做設定,即可享用這些好處. 兩個資訊界的巨人現在打破藩籬,試著提供給客戶更好的服務,大家拭目以待吧!

2009年2月6日 星期五

[IT Architecture] 供應鏈管理系統(SCM) - 台塑網

目前服務的公司, 自去年初 SAP上線後, 內部流程已大致底定. 但SAP著墨的重點在內部流程的銜接, 經過一年的使用,一大半使用者的問題來自於整個系統還有一塊大缺口就是供應鏈管理的部分. 而所謂的廣義的供應鏈管理定議如下 - From Wiki:
=====================================================================
供應鏈管理的目標是在滿足客戶需要的前提下,對整個供應鏈(從供貨商,製造商,分銷商到消費者)的各個環節進行綜合管理,例如從採購、物料管理、生產、配送、營銷到消費者的整個供應鏈的貨物流、信息流和資金流,把物流與庫存成本降到最小。
供應鏈管理就是指對整個供應鏈系統進行計劃、協調、操作、控制和優化的各種活動和過程,其目標是要將顧客所需的正確的產品(Right Product)能夠在正確的時間(Right Time)、按照正確的數量(Right Quantity)、正確的質量(Right Quality)和正確的狀態(Right Status)送到正確的地點(Right Place),並使總成本最小。
一個公司採用供應鏈管理的最終目的有兩個:

(1)提升客戶的最大滿意度(提高交貨的可靠性和零活性)
(2)降低公司的成本(降低庫存,減少生產及分銷的費用)
====================================================================
但公司目前最迫切的是對供應商之間的供應鏈管理(因為對客戶端的供應鍊管理多半由客戶端主動要求), 這一段一直被忽視, 因此定義出了幾項需求出來:

0. 基本上,整個需求定位在ERP系統流程的延伸就是將流程管理延伸至供應商包含資料流部分, 也就是供應商B2B的部分. 有點像將內部流程的觸角向外延伸至供應商和交貨商(Forwarder, Broker).

1. 既然是SCM, 市面上一堆SCM的套裝軟體, 底下是一個網站(http://www.business-software.com/erp-solutions/supply-chain-management/index.php)上的比較資料, 基本上這些套裝軟體不在我SURVEY的範疇,各位看官有興趣可以點以下連結看看.
基本上不考慮有以下幾個原因:
  • 太貴!這個蕭條時刻,動輒上千萬的咚咚還是別碰為妙,因為太貴案子根本不會被核准. 另外,貴在產品本身也就算了,這些套裝產品顧問導入費用更是驚人,搞不好還大老遠請個新加坡或印度的顧問,貴得要死又難溝通.
  • 根據前年導入SAP的經驗,這些產品功能雖然完成,但多半強調所謂的Best Practice,客製的能力又多半不強. 以本公司特殊的代工商業流程,導進來憋手蹩腳. 使用者和IT都痛苦.
  • 基本上,既然方才談到SCM是ERP的延伸,和既有SAP的介面會是整個專案的重點,這又會增加套裝軟體客製的EFFORT(我家的SAP已被客製到不行).

2. 也因此決定將觸角轉進同集團其他公司已導入中的本土企業軟體產品, 台塑網. 這裡將幾個本公司會用到的SCM範疇和使用者的問題和台塑網的SOLUTION 整理出來.

SCM 範疇

遇到的問題

台塑網

採購標案管理(Quotation management)

目前工廠的標案僅由採購員做詢議比價的動作後將最後結果上傳至SAP. 和供應商之間的交易過程無法追蹤, 整個過程不夠透明化.

公司人和和供應商在WEB介面上進行詢議比價的過程,完成後回傳SAP. 缺點是,系統是封閉性的就是架在公司內部,而非台塑網強調的電子市集,所以對採購人員Sourcing的需求幫助不大.

採購單追蹤(PO Tracking)

在採購單發出給供應商後, 供應商如何確認, 如何更新交期等, 必須有一個系統平台供公司和供應商互動.

採購單開立,改版和供應商確認都在WEB上進行,透過和SAP的介面,資訊透明.

交貨管理(Shipment Management)

在供應商要出貨時如何通知公司各部門作相關準備, 資訊流如何連結,如何在正確的時間提交正確的數量其實是一門大學問. 如何避免供應商塞貨或晚出貨都是大問題.

透過交貨提示,ASN開立和催交功能,避免交貨提早或延遲.

庫存管理(Inventory Management)

供應商可透過WEB查詢收貨狀況, Consign庫存狀況. 也可採用VMI(Vendor Management Inventory)模式, 由公司提供庫存高低水位, 供應商自動補貨.

公司和供應商都透過各自系統提供庫存資料,庫存資訊透明.

貨況管理

將供應鍊管理延伸至 Forwarder和Broker, 將進口的貨物的資訊流連結以利進出口人員追蹤. 或在離開供應商或的狀況,我方人員可以一目瞭然.

透過Forwarder, Broker的資訊和ASN資料連結,可以清楚知道貨況.

貨款管理

將前述活動產生的費用予以有效管理.

貨款和運費的管理,提供報表供財務人員查詢.

總得來說,目前和台塑網的案子正處於洽詢階段,根據供應鍊管理的定義,希望系統的導入將公司存貨成本和人員效率透過SCM予以最佳化.

參考文件:

Wiki: 供應鏈
http://www.business-software.com/erp-solutions/supply-chain-management/index.php