最近DBA提到DB的記憶體有緩慢上升的問題
後來知道這是DB的機制,本來就會把記憶體吃滿
但DBA還是提出這樣他無法告之記憶體是否需擴充
針對這問題得看塞的內容是什麼
經過分析,我們的sql plan重複使用太低
也就是sql statement不重複,造成每次得重新compile新的sql
後來知道這是DB的機制,本來就會把記憶體吃滿
但DBA還是提出這樣他無法告之記憶體是否需擴充
針對這問題得看塞的內容是什麼
經過分析,我們的sql plan重複使用太低
也就是sql statement不重複,造成每次得重新compile新的sql
- 減少Compile次數
- 使用Stored Procedure
微軟建議SQL compile 不要超過 Batch Request的10%, 但我們的系統大約在40%
因此建議我們用Stored Procedure,當然我們沒用這方面 - 使用prepare(bind)
我本以為prepare只是用來過濾sql injection
原來db在執行時,也得把sql statement先compile過
因此where的條件不同,就會被當成新的statement
這時便可透過prepare,把參數給參數化 (我想不到更好的詞了 Orz)
如此一來該句只會被compile一次~
p.s. sql也是需被compile的,嗯... 我從沒想過這問題...
- PHP的PDO未實際改寫
我們早就用bind的方式寫sql,但不曉得為何仍沒有轉換
後來才發現原來PDO沒有實際轉換,而只是replace而已
p.s. 不確定是PDO or 其他地方,先拿PDO當替死鬼
- 使用Stored Procedure
沒有留言:
張貼留言