2015-06-22 67 views
0

我正在研究數據攝取應用程序。我必須在oracle中運行查詢,然後將結果集插入到Vertica中。但是,我發現完成這項任務需要更多的時間。這就是我所做的。在Oracle和Vertica之間移動數據的高效方法

1)在oracle中執行查詢並獲取結果集。同時打開與vertica的連接並創建一個準備好的語句。

2)將oracle結果集作爲一批30K記錄讀取,並使用Vertica準備好的語句執行它們。

3)從Oracle讀取下一批記錄並重復步驟2,直到從Oracle結果集中讀取所有記錄。

我面臨兩個問題的方法:

1)的過程極其緩慢。

2)部分記錄遺漏,不會傳遞給Vertica。

我可能的解決方案:

  1. 複製甲骨文的結果集到一個文件中並傳遞給Vertica的。這需要在代碼中包含一些文件清理工具。
  2. 我可以使用VerticaCopyStream API將它們插入到Vertica表中。 VerticaCopyStream API的工作速度比Prepared語句快得多。它需要將一個輸入流傳遞給該文件。
  3. 如果解決方案1不比當前的解決方案更好,我可以考慮將結果集的輸入流傳遞給VerticaCopyStream API。

我應該只通過Java來做到這一點。你能針對這種情況提出優化的解決方案嗎?

+0

你有任何ETL工具嗎? – Kermit

+0

不需要。我必須用java做這件事 – Santhosh

+0

你只需要用Java來完成這項工作。 – woot

回答

0

U可以使用進程構建器創建一個進程,該進程可以將數據從Oracle轉儲迴文件並使用進程生成器將其加載回垂直位置 因此,使用進程生成器創建可以轉儲到文件中的命令行,再次使用相同的加載回

+0

我不想通過使用Shell命令來執行此操作。 – Santhosh

+0

所以你不能從java調用命令行將數據轉儲到文件中 – hopeIsTheonlyWeapon

+0

是的。但是我可以從java寫入並且不使用任何Shell交互 – Santhosh

1

我會去的第一個選項(簡單更好)。 的想法是讓CSV類型的輸出

 --Set the linesize large enough to accommodate the longest possible line. 
    SET LINESIZE 80 
    SET PAGESIZE 0 
    SET FEEDBACK OFF 
    SET TRIMSPOOL ON 
    SET TERMOUT OFF 
    SPOOL table.csv 
    --setup headings 
    SELECT '"col1","col2","col3","col4"' FROM dual; 
    --create query to extract 
    SELECT TO_CHAR(col1) || ',' 
      || TO_CHAR(col2) || ',' 
      || TO_CHAR(col3) || ',' 
      || '"' || col4 || '"' 
    FROM table; 
    SPOOL OFF 
host 'vsql -U dbadmin -w dbadmin -c "copy table from 'data.csv' delimiter ',' enclosed by '"' direct;" 

- 如果這個過程是緩慢的,那麼您需要考慮提高提取查詢。所有的格式都不是一個很大的資源消費者。

在您的crontab或甚至Oracle調度程序中設置作業以運行作業。 我建議在您的Vertica主機或處理數據加載的主機上安裝Oracle客戶端。

已將複製命​​令放置在假脫機腳本中,這樣我就可以確保複製命令只在假脫機完成時運行,否則就如您所說需要很長時間,所以您不希望假脫機與某些可能執行加載的crontab作業不同步。

在這裏,您可以使用腳本輸出和驗證shell腳本實現負載監視,甚至可以使用導出和加載的結果發送一些電子郵件。

+0

感謝您的答案。但我需要以編程方式執行此操作,而無需調用Shell或其他東西 – Santhosh

相關問題