首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

面試題:百萬級三表關聯查詢優化策略——游標分批與內存控制

     編輯:程式設計綜合問答

題目

三張表,各百萬條記錄,如何高效查詢?面試官意圖考察數據庫優化與大數據處理思路。

核心思路

避免一次性將百萬行載入內存導致 OOM,採用「流式處理」或「分頁拉取」。

方案對比

方案優點缺點適用場景
游標內存佔用極低,逐行處理編程複雜,長事務鎖風險批量導出、ETL
分頁查詢實現簡單,易控制事務深分頁性能下降Web 分頁展示、增量同步
臨時表/物化視圖查詢速度快維護成本高固定報表、高頻查詢

推薦回答要點

  1. 索引優化:關聯字段、過濾字段建立聯合索引。
  2. 只查所需列:避免 SELECT *。
  3. 分批獲取:JDBC 設置 setFetchSize(1000) + ResultSet.TYPE_FORWARD_ONLY,或應用層分頁 LIMIT offset, size。
  4. 游標/流式結果集:MySQL USE_CURSOR_FETCH、Oracle ResultSet.TYPE_SCROLL_INSENSITIVE。
  5. Hint/執行計劃:必要時加 /*+ LEADING(t1 t2 t3) USE_NL(t2) */ 引導優化器。
  6. 異步/並行:拆分任務多線程處理,最後聚合。

代碼示例

// 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 等具體手段,體現系統性思考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved