2012-10-11 102 views
0

我有一個包含15,000,000條記錄的表。這些記錄可以基於某些匹配字段(通常是單個組中的最大值3或4)相互關聯。每個記錄也有一個與之相關的日期,但是這個日期並不一定與它加載到表格中的日期/訂單相關。與大型數據集的視圖與索引表的性能

這些記錄定期用於更新數據庫中的其他記錄。儘管如此,我只關心最新的唱片,並且在1500萬條唱片(正在更新1000萬條唱片)上,我想確保我忽略了其他所有內容。如果最新記錄已經有「更新」標誌,我也想跳過更新。

我一直在使用這樣的一個觀點,收集各組內的最新記錄:

SELECT a, b, c, max(scan.timestamp) AS latest_scan 
FROM scan 
GROUP BY a, b, c; 

然後我用一個WHERE子句中我UPDATE忽略具有更新標誌的任何記錄。

有了這麼多的記錄,我可以使用視圖嗎?我已經看到人們開始創造真正的索引表,以提高性能,但我仍然認爲這需要很長時間。這是我可以從中受益嗎?

回答

0

大多數情況下,您需要嘗試一下,看看錶現如何。

關鍵是視圖最終會成爲一個子查詢的快速標記,它會給出優化器信息。所以,它仍然主要取決於優化器是否可以找到用於您調用數據庫的SQL語句的索引。

請注意,您在視圖中可能不需要ORDER BY,因爲您將在其他一些SQL語句中使用它,然後可以對記錄進行排序。如果優化器沒有發現它可以跳過順序,那麼當你不需要的時候,你將花費時間進行排序。

我期望你可以使用GROUP BY a,b,c來獲得組的最大時間戳。

+0

我的錯誤 - 它應該是GROUP BY而不是ORDER BY。你說這個視圖會被用來給優化器信息 - 當使用視圖時,它是否考慮到它基於的表的索引? –

+1

基本上所有的視圖是,就查詢引擎而言是一個帶有名稱的查詢,所以基本上它把select *從MyView看作select * from(視圖中的sql),所以它確實使用了基礎表指數。 –