производительность php sqlsrv_fetch_object - PullRequest
1 голос
/ 07 января 2010

Привет!

Я пытаюсь решить несколько проблем с производительностью, которые возникают на нашем сайте. В рамках этих усилий я начал профилировать наши страницы с наибольшим объемом трафика в соответствии с GA.

По сути, я определил, как я изначально подозревал, что большую часть времени тратится на трафик, связанный с базой данных ... имеет смысл. К сожалению, если присмотреться, то, что я обнаружил, не имеет особого смысла.

Например, этот конкретный вызов MyAlganon_Model_Library_Item :: fetchItemTooltipsByItemIdArray () занимает 580,41 мс для возврата на мою промежуточную платформу.

После погружения 47.27 мс этого времени тратится на sqlsrv_query (), а 533.12 мс - на функцию fetchAll (), которая просто выполняет цикл sqlsrv_fetch_object:

$row = sqlsrv_fetch_object($this->query);

while ($row) {
  $results[] = $row;
  $row = sqlsrv_fetch_object($this->query);
}

return $results;

Похоже, на этой конкретной странице в наборе результатов 742 строки. Может быть, это просто вопрос того, что я не имею реалистичной информации о том, сколько времени потребуется для генерации объекта StdClass? 533.12ms кажется нормальным временем для итерации по результатам 742 и превращения их в массив объектов?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

В зависимости от того, что вы делаете, mssql_ примерно на 33-60% быстрее, чем sqlsrv_ в моем тестировании

1 голос
/ 07 января 2010

Как вы сказали в своем комментарии, вы запрашиваете 742 строки с 41 столбцом.

Это довольно некоторые данные, которые вы используете. Если вы используете все 41 столбец, но только несколько строк, вы можете разделить ваш запрос. Больше запросов не всегда неэффективно, если вы можете оптимизировать, чтобы получить меньше данных.

Используются ли 41 столбец из всех 742 строк? Возможно, вы можете сделать простой запрос, чтобы выбрать, для какой из 742 строк вам нужны все данные.

0 голосов
/ 17 февраля 2011

Я тоже пытался использовать sqlsrv и обнаружил, что он может быть очень медленным, иногда требуется несколько секунд для подключения и выполнения простого запроса - даже для таблицы с дюжиной строк и несколькими столбцами. В моей системе разработки это было быстрее (подключение к локальному SQL Express), чем на целевом хосте (настоящий SQL Server, дорогой хостинг премиум-класса).

Веб-хостинг даже провел некоторые тесты и сказал: «Похоже, это говорит о том, что проблема заключается в драйвере Microsoft SQL Server для PHP, а не обязательно в веб-серверах или серверах баз данных или в условиях сети». Он сравнивал его с использованием ADODB: «Обратите внимание, что это соединение ODBC, оно не использует собственный драйвер PHP MSSQL, который, честно говоря, нестабилен и его следует избегать. [...] Тестовый скрипт, описанный выше, обычно выполняется значительно лучше, чем другой тестовый скрипт, который подключается с помощью драйвера Microsoft SQL Server для PHP. "

Однако в моей собственной системе sqlsrv_connect подключался намного быстрее (обычно от 0,1 мс до 100 мс), чем $ conn = ADONewConnection ('odbc_mssql'); $ conn-> Connect (); (обычно между 30-200 мс). Все еще тестирую другие скорости: этот проект был более чувствителен к задержкам, чем что-либо еще.

Небольшое примечание: вы можете обновить предоставленный фрагмент: (немного чище)

while (($row = sqlsrv_fetch_object($this->query))) {
  $results[] = $row;
}
return $results;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...