, мы переключили наше соединение с DB из ADODB на SQLSRV, и у меня, похоже, возникли проблемы с этим, вызвав промежуточные задержки с использованием sqlsrv_fetch_array.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-1мс за звонок, иногда это будет до 15 мс. Почему я говорю, что случайным является то, что если я повторно запускаю код несколько раз, задержки не будут происходить в одном и том же месте и будут меняться по количеству, поэтому это происходит не потому, что определенная строка большая (ни одна из них ни одна из них) ,
Есть ли у кого-нибудь идеи, на что я мог смотреть, что это может быть сделано, будь то параметр или конфигурация где-нибудь? Я не думаю, что это связано с сервером/сетью, поскольку ADODB этого никогда не делает. Мы используем PHP 5.6 и php_sqlsrv_56_ts.dll/php_pdo_sqlsrv_56_ts.dll и SQL Server 2008.
Спасибо!
Как насчет разных типов выборки и прокрутки? Например, оставляя их с параметрами по умолчанию, каков интервал времени? Похоже, что речь идет о некоторых операциях underhood в dll. – alalp
Благодарим за предложение, изменив тип прокрутки! Похоже, проблема SQLSRV_CURSOR_STATIC. Я пробовал все параметры, и SQLSRV_CURSOR_FORWARD дает ту же скорость, что и ADODB. Вы теряете способность двигаться вперед/назад, но это не большая проблема. SQLSRV_CURSOR_CLIENT_BUFFERED работает очень быстро, но в некоторых случаях имеет проблемы с памятью.Все остальные опции, которые позволяют перемещаться вперед и назад, имеют ту же проблему, что и SQLSRV_CURSOR_STATIC с точки зрения скорости, поэтому там должно быть что-то. Если вы хотите написать это как ответ, я приму это. – user3242224
Вы можете добавить свой собственный ответ, потому что вы его протестировали, и у вас есть лучшее знание об этом. Я не хочу просто копировать-вставить комментарий :) – alalp