2016-04-26 54 views
2

intermitent延遲我們將我們的數據庫連接從ADODB切換到SQLSRV,我似乎有問題導致使用sqlsrv_fetch_array intermitent延遲。PHP SQLSRV具有sqlsrv_fetch_array/sqlsrv_fetch

我在我的數據庫中做了一個查詢,返回大約426行5個字段。

的代碼看起來是這樣的(速度基準目的,我真正刪除任何東西它在做什麼):

$conn = sqlsrv_connect($host, array("UID"=>$userName,"PWD"=>$password,"Database"=>$dbName,"QuotedId"=>false, "CharacterSet" =>"UTF-8"); 

$rsText=sqlsrv_query($conn,$sqlStr,array(), 
       array(
        "Scrollable"=>SQLSRV_CURSOR_STATIC 
       )); 

$row = array(1); 
while(count($row) != 0){ 
    $row=sqlsrv_fetch_array($rsText,SQLSRV_FETCH_BOTH, SQLSRV_SCROLL_NEXT); 
} 

與ADODB運行這需要我周圍的50毫秒。使用sqlsrv運行它需要500-1000毫秒。原始查詢(sqlsrv_query)對於sqlsrv實際上比ADODB更快,但對於sqlsrv_fetch_array存在隨機時間延遲(實際上,我使用sqlsrv_fetch進行了測試並獲取它們)。我每次打電話時都會記錄ms,而每次打電話通常爲0-1ms,有時會達到15ms。爲什麼我說它的隨機性是,如果我多次重新運行代碼,延遲不會發生在同一個地方,並且數量會有所不同,所以這不是因爲特定的行很大(它們都不是這兩種方式中的任何一種) 。

有沒有人有任何想法,我可以看看這可能是這樣做的,無論是參數或配置的地方?我不認爲這是服務器/網絡相關的,因爲ADODB從來沒有這樣做。我們使用PHP 5.6和php_sqlsrv_56_ts.dll/php_pdo_sqlsrv_56_ts.dll和SQL Server 2008.

謝謝!

+0

不同的提取和滾動類型如何?例如,讓它們保留默認參數,時間間隔是多少?看起來這是關於dll中的一些發泄操作。 – alalp

+0

謝謝你的建議,改變滾動類型的工作!看來SQLSRV_CURSOR_STATIC是問題所在。我嘗試了所有的選項,並且SQLSRV_CURSOR_FORWARD給出了與ADODB完全相同的速度。你失去了前進/後退的能力,但這不是一個大問題。 SQLSRV_CURSOR_CLIENT_BUFFERED變得非常快,但在某些情況下存在內存問題。所有其他允許向前和向後移動的選項在速度方面與SQLSRV_CURSOR_STATIC具有相同的問題,因此必須具有某些內容。 如果你想寫這個答案,我會接受它。 – user3242224

+0

你可以添加你自己的答案,因爲你測試了他們,你對此有更好的瞭解。我不想複製粘貼你的評論:) – alalp

回答

0

正如alalp在評論中所建議的,我嘗試修改滾動類型並修復了問題。

我做了一些快速的標杆,這裏是我得到了什麼:

SQLSRV_CURSOR_STATIC,SQLSRV_CURSOR_KEYSET和SQLSRV_CURSOR_DYNAMIC:嚴重​​的速度問題。正如原來的文章所述,即使是中等數量的記錄(少數幾百個)也會佔用一秒以上。

SQLSRV_CURSOR_FORWARD:沒有速度問題。花了大約50ms循環遍歷我的例子中的記錄,這與ADODB相同。你失去了執行MoveFirst/MovePrev的能力,但是我認爲這很容易通過將結果存儲在你的第一次傳遞中的數組來解決,如果需要的話,或者根據查詢,在很少的情況下重新運行它可能很好需要。

SQLSRV_CURSOR_CLIENT_BUFFERED:極快的(因爲從我的理解,在我的例子,這是有道理的0毫秒這是基本相同的陣列中的存儲整個事情)。儘管如此,我們確實在一些較大的數據集中存在內存問題

在我們的項目中,我們最終使用SQLSRV_CURSOR_CLIENT_BUFFERED作爲公共網站,因爲在一個頁面中沒有提取任何主要數據集,並且SQLSRV_CURSOR_FORWARD用於後端,最終可能會拉動1000行數據。