我想在Oracle數據庫中構建一個報表工具,該工具根據在不同表上運行的多個相當複雜的查詢的結果來計算評分。如果某些標準匹配,所有這些查詢都會給我一個特定ID的列表。基於多個複雜查詢的Oracle評分報表視圖
下面是一個例子:
想象會有三個查詢「查找居住在西雅圖的所有用戶ID」,「查找在過去三個月買了一輛車所有用戶ID」和「查找所有在美國境內移動的用戶ID超過3次「。如果爲查詢找到用戶ID,則這些查詢中的每一個都將得到用戶的分數,例如,查詢1 = 3分,查詢2 = 5分,查詢3 = 2分。最終結果應該提供至少有一個查詢匹配的用戶及其ID的列表。結果集將按所有分數總和降序排列。結果集應該是最新的。
| user_id | points_lived_in_seattle | points_bought_car | points_moved | sum | ------------------------------------------------------------------------------ | 123 | 3 | 0 | 2 | 5 | | 456 | 0 | 3 | 0 | 3 | | 789 | 0 | 0 | 2 | 2 |
在Oracle中實現這種報表工具的最佳方式是什麼?我正在考慮爲它創建一個視圖,但這會非常困難,因爲在不久的將來可能會添加20個或更多的查詢。另外我擔心的是,結合所有查詢的連接不能正確工作並導致錯誤的結果集。
我在想的另一個選擇是爲每個查詢創建一個物化視圖,以及一個基於其他視圖創建評分的視圖。
你將如何去解決這個問題?如果查詢非常慢,整體數據庫可能會對性能產生什麼影響?
是不是因爲通過改進查詢執行時間來使用物化視圖的原因,您希望通過數據聚合來獲得?我認爲它會在執行之前預先計算昂貴的連接和聚合操作,並將結果存儲在表中。數據應該是最新的。只需運行一次並將其插入表格中將無濟於事。我需要一個觀點。你將如何將查詢結合到SQL中的得分視圖? –
如果你有昂貴的連接和聚合操作,那麼在數據庫上的加載並不會因物化視圖而減少,但由於所有額外的活動在其周圍進行而增加;儘管我承認查詢時間會更快。據我所知,如果表中的單行更改了物化視圖,則整個物化視圖必須重新同步。這就是我對我們所有的大量查詢所做的。我們使用數百萬行表創建20-30個表,並將結果插入參考表中,然後可以在幾秒鐘內查詢。 – Ben
如果您希望報告花費很長時間,並且您的表格很大,那麼如果您使用表格,物化視圖或單個視圖將它們放在一起,那麼使用20個連接就很難做到這一點。 – Ben