某專案剛上線第二天,後台監控發現異常:資料庫服務器與 IIS 服務器之間的網絡 IO 直接衝上 70%–100%(1 Gbps 頻寬被佔滿,每秒傳輸 700 MB–1 GB),資料庫記憶體飆升至 21 GB,IIS CPU 長期維持在 80%–90%,導致網站頻繁出現連線逾時。團隊被迫緊急關站維護,展開全方位排查。
SELECT *經過一小時的日誌分析與蹤跡,鎖定問題核心——一條語法完全正確的 SQL:
SELECT * FROM Table1
為何會釀禍?
COUNT(*)SELECT COUNT(*) FROM Table1
修改上線後,網絡 IO 瞬間跌至 10 MB 以下,資料庫記憶體穩定在預期的 12 GB,CPU 占用大幅下降,系統恢復正常。
| 階段 | 耗時 | 關鍵動作 |
|---|---|---|
| 問題發現與定位 | 1 小時 | 監控告警 → 關站 → 開啟 Profiler / Extended Events → 鎖定高頻 SQL |
| 代碼變更與驗證 | 5 小時 | 跨多個微服務搜尋調用點 → 修改 ORM / 存儲過程 → 回歸測試 → 灰度發布 |
教訓:「簡單」的 SQL 最容易被忽視。上線前的效能基準測試、索引審查、以及「統計類查詢禁止 SELECT *」的編碼規範,能將此類風險壓縮到分鐘級。
COUNT(*) 或觸發器維護計數表。SELECT *;只取必要欄位。COUNT(*) 僅掃描索引頁。看似微小的語句優化,實則是系統穩定性的分水嶺。下次再見 SELECT *,請三思而後行。