星期四, 5月 08, 2014

DB 記憶體緩慢上升

最近DBA提到DB的記憶體有緩慢上升的問題

後來知道這是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當替死鬼


沒有留言: