2014-01-09 99 views
0

描述:我有一個事務表,每秒插入一個〜200(+ -100)行的平均值,本系統從中查詢以檢索數據基於客戶端ID,有/無時間(按升序排列)以及其他幾個條件。此表進行分區時,表格僅包含當天的數據,較早的數據存儲在< table_name_date_year>中。查詢在此表上運行以生成針對客戶的各種詳細報告。如何在內存緩存中存儲巨大的(Oracle)數據集

最近一次改進以提高性能,1)獲取表的最小值和最大值,2)並行查詢每50000條記錄表(每次只有5個記錄),運行查詢條件爲<>和< to>,直到達到最大值3)生成報告,4)合併報告。

問題:由數據庫開發人員完成各種查詢調優後,查詢仍然運行速度較慢(需要很長時間才能完成)。

是否可以使用像memcached或redis(或ehcache?)或「任何其他緩存框架」這樣的內存數據緩存來存儲/更新存儲在客戶端ID上的數據,以便報告系統獲取數據從緩存中生成報告,而不是直接從主數據庫查詢? (例如:< key,pair>,< client-id,{dataset}>)如果是這樣?

像HAZELCAST或兵馬俑或(我沒有探討太多這方面)或Apache Gora的bigdata實現可以在這裏使用嗎?如果是這樣如何?

基於Java的解決方案是否可以使用MappedByteBuffer開發,但這樣做是否有效?

+0

剛剛從數據庫加載數據還是數據庫以任何方式聚合/壓縮數據?在生成報告時,加載數據的訪問模式是什麼,例如是流式傳輸還是有很多點或範圍訪問?要處理的記錄有多大?記錄大小是多少?每個記錄是否有唯一的密鑰?記錄是否可以預先聚集或聚集,例如通過在15分鐘桶中存儲一個客戶的記錄?該技術是否能夠生成純java報告?報告生成POJO需要數據格式嗎? – cruftex

回答

0

如果您願意放棄ACID,NoSQL數據庫可以幫助您。 一般而言,您不具備使用這些查詢執行SQL查詢的能力,因此您將要處理大型鍵值集和列表。 不要過度複雜的設置,嘗試一個樸素的方法與POJO,看看它是否有效,如果沒有,嘗試Redis。

0

您探索的最短路徑是Oracle的TimesTen。由於它也是Oracle產品,因此它可能(可能)最容易與當前系統集成。在非常高的層次上,您可以將其插上,並且,它是您的Oracle數據庫的內存緩存,並且會自動保持同步。而且,您將能夠使用相同的SQL操作。

如果這樣不能使您達到所需的性能,可以查看我公司的產品eXtremeDB。我們有相當多的客戶將它用作Oracle的前端緩存。它不是Oracle的產品,所以你使用的Oracle的SQL可能需要調整,並且需要做一些工作來使eXtremeDB與Oracle保持同步(但是與使用NoSQL/key-價值對解決方案)。回報是eXtremeDB比TimesTen快很多(Oracle的許可證不允許發佈基準,所以我不能更具體)。