[SQL ] 為什麼select這麼慢?
常常會聽到有這種說法:
"select動作很慢 是不是 Hardware/OS/database config 有問題"
大致上歸類有以下幾種情形 (這是我自己的分類~~呵~~)
1.應用程式
這邊我指的是 - 設計與實作
這個部分也是最容易看到效果也最不花錢的
但是最花時間 @@
設計
通常是比較難解決的
如 table design 的錯誤 想改正 可能要整個打掉重做
若是開發中或是測試用的系統可能還好
但是...prod DB怎麼可以說停就停說打就打
有些機器整年都不能停...那怎麼辦? @@"
實作
這一段就是重點了
我所經驗過的效率問題(雖然不是很多經驗)
80%以上集中在這一塊
一般程式師由於對資料庫的"操作"不熟悉
因此好像總有個印象認為只要懂得 SELECT、JOIN、Group 就好
也就是只求正確(嗯...Schedule的壓力問題我們不討論 = =)
我所說的操作並不是單純下下SQL就OK
而是一些基本可以避開的問題點 算是基礎觀念
在這一方面 如果可以做到盡可能避免這些問題
不只可做出效率佳的程式 也可減少在硬體上的成本浪費
以下與資料庫本身的廠家設計無關 我想應該通用吧 ^^
大部分我還是以 Oracle 為主
A).存取Data的數量
不必要的data勿 select 出來後再剔掉
盡量在SQL上將存取的限制做好
程式可以少處理一筆就少處理
B).Index的使用
適當使用Indexes
在random access時可以確保程式的效率
但也需要避免Indexes的濫用
如一個table有 10以上的 indexes
不要懷疑 就是會有 = ="
我想各個資料庫的Index基本原理是大同小異的
但可以提供的功能確可能不太相同
如:
欄位是否可以倒置
存取資料超過整個table多少%時 Index反而浪費Resource
這些需要查過手冊才知道
C).網路傳輸
這是最容易被忽略的一個部分
常常程式師會將Business寫在前端(指非資料庫)的程式中
因此 將data透過網路由Client(包括Applicatin Server)處理
在網路傳輸上面浪費時間是一件可怕的事
我們很可能無法察覺原來程式的效率瓶頸出在這裡
我曾試過
將整個 program 寫在 Store Procedure/Function中
與寫在前端的應用程式中
使用相同的 SQL , Data數量 , database config
速度可以相差到 10倍 = ="
D).批次工作的分配
有資料產生 就一定有報表需求
報表通常是User最會Complain的一個部分
我們可以將這些批次工做分配到時間軸上
而不是一次跑完
舉例說明
若系統每月需產生月報表
則每日將當日結算資料設計產生至另一個日結算table
跑月報表時將可以大大節省時間
當然 有些情況下 無法設計日結算的table(可能因BUSINESS問題)
這就需要靠各位的 Know How 及智慧去解決嚕
E).轉個彎會不會更好
有些時候無法避免
需要存取的 data就是這麼多
上面提到的幾點也都考慮了
但還是跑很久
由於data原本就需處理這麼多
這時是不是用些偷吃步的做法(呵~)
可能會讓程式跑的更快
舉例
將需存取的資料先暫存於某一temp table
再進行處理
這一部分的應用需要對資料庫本身的Feature有一定的瞭解
否則反而會造成其他資料庫的影響
2.系統異常
嘿...這個呢 有可能發生在任何一個環節
OS NETWORK DATABASE 都有可能
不過 異常通常會導致...完全沒辦法動 = ="
如 Oracle 8i 中 temporary segment會發生的錯誤 storage parameter setting
所以 也跳過 (我看是不知從何講起吧 噗~)
3.Hardware/OS/database - Config 有問題
這個我們不討論 (是因為不知道怎麼討論吧 @O@ )
因為發生的機會實在...不高
config 有問題 機器開始跑的第一天就會知道了
不會等到跑了好一陣子才出現 = =
=====================================================
如果以上的問題都已經處理過了
還是不滿意
那就...花錢買硬體吧
不過擴充硬體實在是個無底洞 @@"
而且效果有限得很...
還有一點很重要
如果說...
你的資料庫TABLE永遠也不會超過 某一個數量(如 100,000 筆)
那...上面有些情況就可以不用考慮了
反正 ... 多做了些工 也感覺不出來快在哪裡 QQ
最後要提到
Performance Tuning 永遠都是很花時間的
需要實際資料量的執行以得到真正的tuning效果
評估永遠是評估
實作完測試後才知道
- 改變後的做法及測試的問題點究竟是不是問題所在
以上如有謬誤 還請各位指點 ^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.145.230.2
推
07/05 15:33, , 1F
07/05 15:33, 1F
推
07/05 23:18, , 2F
07/05 23:18, 2F
推
07/06 00:24, , 3F
07/06 00:24, 3F
推
07/06 08:25, , 4F
07/06 08:25, 4F
推
07/06 09:09, , 5F
07/06 09:09, 5F
推
07/06 09:16, , 6F
07/06 09:16, 6F
推
07/06 10:33, , 7F
07/06 10:33, 7F
Database 近期熱門文章
PTT數位生活區 即時熱門文章