2010-01-06 2 views
1

Приветствую!php sqlsrv_fetch_object производительность

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

По существу, я определил, как я и предполагал, большая часть времени тратится на трафик, связанный с базой данных ... имеет смысл. К сожалению, когда мы смотрим поближе, то, что я нашел, НЕ ПРИНИМАЕТСЯ с таким же чувством.

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

После погружения в это 47.27ms того времени тратится на sqlsrv_query() в то время как 533.12ms из него проводится в функции 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 и превращения их в массив объектов?

+0

Что такое запрос? Проблема, вероятно, связана с запросом, а не с функцией. –

+0

Я могу разобраться с запросом из sproc, если это необходимо, но я не вижу, как это может быть запрос, в котором sqlsrv_query возвращается в 47.27ms, которая является частью, выполняющей sproc. Оставшиеся 533,12мс просто повторяются по результирующему набору, вызывая sqlsrv_fetch_object – jdsmith2816

+0

Если ваш запрос возвращает огромное количество столбцов, потребуется время, чтобы обернуть его в объекты StdClass. Оптимизация запроса/таблицы в этом случае решит вашу проблему. –

ответ

1

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

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

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

+0

Я использую все 742 строки и все 41 столбцы, результирующий набор как можно меньше. Таким образом, по существу, 600 мс для создания этого множества объектов, когда набор результатов будет таким широким, следует ожидать. Я могу работать с этим; Посмотрю, как работает страница при использовании sqlsrv_fetch_array. Если бы это был только один запрос, я бы не возражал против 600 мс; но на странице есть еще четыре вопроса. Ни один из них не занимает почти столько времени, чтобы fetchAll(), как этот, но все же он складывается. – jdsmith2816

+0

Спасибо за диалог Джимми, помощь была высоко оценена. :) – jdsmith2816

+0

Нет проблем. Оптимизация может быть довольно сложной задачей. :) –

3

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

0

Я пытался использовать 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; 
Смежные вопросы