三張表,各百萬條記錄,如何高效查詢?面試官意圖考察數據庫優化與大數據處理思路。
避免一次性將百萬行載入內存導致 OOM,採用「流式處理」或「分頁拉取」。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 游標 | 內存佔用極低,逐行處理 | 編程複雜,長事務鎖風險 | 批量導出、ETL |
| 分頁查詢 | 實現簡單,易控制事務 | 深分頁性能下降 | Web 分頁展示、增量同步 |
| 臨時表/物化視圖 | 查詢速度快 | 維護成本高 | 固定報表、高頻查詢 |
SELECT *。setFetchSize(1000) + ResultSet.TYPE_FORWARD_ONLY,或應用層分頁 LIMIT offset, size。USE_CURSOR_FETCH、Oracle ResultSet.TYPE_SCROLL_INSENSITIVE。/*+ LEADING(t1 t2 t3) USE_NL(t2) */ 引導優化器。// JDBC 流式讀取
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE); // MySQL 啟用流式
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
// 處理單行
}
面試時先說「不會一次性載入內存」,再展開分頁/游標/索引/Hint 等具體手段,體現系統性思考。