close
原本對 Sybase 查詢的程式,配合資料庫要移轉到 MSSQL (SQL server),要做調整。發現在執行到 fetch 時奇慢無比,在 SQL server management studio 裡可以秒回的查詢,在程式裡要跑 12~15 秒。
execute 回應的速度很快,真正卡住的點是 fetch()。所以用 "PHP pdo fetch slow" 當關鍵字找了一些解法:
- "Slow SQLSRV PDO query performance with parameterized queries"。這篇提供兩種方法,對我都無效:
- 參數化查詢時,把 bindValue 改成 bindParam
- 在連接資料庫物件時,設定編碼,增加 $conn->setAttribute( PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM );
- "How to: Disable Multiple Active Resultsets (MARS)",在設定 sqlsrv 連線字串時,指定 "MultipleActiveResultSets=false"
後來同事說要在綁 PDO 的 prepare 時增加參數,原本為了抓 RowCount() 的寫法是:
<?php $sth = $dbh->prepare($sql, array(
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
)); ?>
再加一個參數 PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE,改成:
<?php $sth = $dbh->prepare($sql, array(
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED
)); ?>
但加上 SQLSRV_CURSOR_BUFFERED 後會吃記憶體,連線數變多時,系統負載會增加。詳細可參考:《資料指標類型 (PDO_SQLSRV 驅動程式)》。
目前想到最好的方法是資料筆數另外取,不要用到 PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL。
文章標籤
全站熱搜
留言列表