4m@t!c
Александр
Низкая производительность связки PHP+MSSQL
Конфигурация.
Есть два сервера. Оба под управлением Windows.
На одном из серверов установлен MSSQL 2000. На втором работает связка Apache2.2+PHP5.2.2+MySQL5. Для связи с СУБД используется API из стандартной библиотеки php_mssql.dll. Соединение идет по TCP/IP.
Логика работы приложения.
Логика достаточно специфическая. Идет интеграция двух продуктов. Один на MSSQL, второй на MySQL. В БД MySQL хрнится техническая информация о продуктах, в MSSQL - коммерческая.
Из MySQL выбираются основные данные с помощью одного запроса, а в MSSQL выбираются вторичные данные путем отправки простейших процедур. Процедуры запрашиваются в цикле и их количество варьируется от 10 до 20 штук. На клиенте полученная информация окончательно обрабатывается и формируется массив, которые отправляется ф функцию представления документа.
Проблема.
Процедура отправляется с помощью функции mssql_query(). На отправку запроса и получение идентификатора результата уходит 2-5 секунд - это достаточно много. Если помножить на количество отправляемых запросов процедур, то получаем 20-100 секунд. Что при генерации обычной HTML страницы - огромный интервал времени.
Если повторно вызвать скрипт с одинаковыми параметрами, то, скорость выполнения скрипта увеличивается в разы. Т.е. такое впечатление, что идет кеширование.
Если вызывать процедуру с помощью MSSQL Query Analizer, то время выполнения процедуры исчисляется сотыми доли секунды. Т.е. кеширование результат запроса сервера отпадает.
Как пробовал решить проблему.
Естественно, полез в ман. Какой-то специфической информации по настройке связки PHP+MSSQL не нашел.
Потом решил попробовать выполнять процедуры с помощью mssql_execute(). Эффект тот же. Более того сравнил скорость работы mssql_query(), mssql_execute() и odbc_exec(). Быстрее всех отрабатывает mssql_query(), чуть медленнее (20-30%) mssql_execute(), ну и в разы медленнее odbc_exec().
В тесте я в цикле вызывал процедуру MSSQL. Так вот иногда первый цикл выполнялся дольше, чем остальные. Причем, дольше в разы.
Гугиление по словам optimization, performance ничего вразумительного не дали. Поиск по форуму - тоже.
Пробовал изменять сетевой алиас сервера с MSSQL на его IP - первые несколько запросов отработали достаточно быстро, но, затем опять все работает очень медленно.
Вопрос.
Если у кого были подобные проблемы - поделитесь опытом решения. Или, возможно, я где-то туплю, то подскажите - где? Куда рыть?
Конфигурация.
Есть два сервера. Оба под управлением Windows.
На одном из серверов установлен MSSQL 2000. На втором работает связка Apache2.2+PHP5.2.2+MySQL5. Для связи с СУБД используется API из стандартной библиотеки php_mssql.dll. Соединение идет по TCP/IP.
Логика работы приложения.
Логика достаточно специфическая. Идет интеграция двух продуктов. Один на MSSQL, второй на MySQL. В БД MySQL хрнится техническая информация о продуктах, в MSSQL - коммерческая.
Из MySQL выбираются основные данные с помощью одного запроса, а в MSSQL выбираются вторичные данные путем отправки простейших процедур. Процедуры запрашиваются в цикле и их количество варьируется от 10 до 20 штук. На клиенте полученная информация окончательно обрабатывается и формируется массив, которые отправляется ф функцию представления документа.
Проблема.
Процедура отправляется с помощью функции mssql_query(). На отправку запроса и получение идентификатора результата уходит 2-5 секунд - это достаточно много. Если помножить на количество отправляемых запросов процедур, то получаем 20-100 секунд. Что при генерации обычной HTML страницы - огромный интервал времени.
Если повторно вызвать скрипт с одинаковыми параметрами, то, скорость выполнения скрипта увеличивается в разы. Т.е. такое впечатление, что идет кеширование.
Если вызывать процедуру с помощью MSSQL Query Analizer, то время выполнения процедуры исчисляется сотыми доли секунды. Т.е. кеширование результат запроса сервера отпадает.
Как пробовал решить проблему.
Естественно, полез в ман. Какой-то специфической информации по настройке связки PHP+MSSQL не нашел.
Потом решил попробовать выполнять процедуры с помощью mssql_execute(). Эффект тот же. Более того сравнил скорость работы mssql_query(), mssql_execute() и odbc_exec(). Быстрее всех отрабатывает mssql_query(), чуть медленнее (20-30%) mssql_execute(), ну и в разы медленнее odbc_exec().
В тесте я в цикле вызывал процедуру MSSQL. Так вот иногда первый цикл выполнялся дольше, чем остальные. Причем, дольше в разы.
Гугиление по словам optimization, performance ничего вразумительного не дали. Поиск по форуму - тоже.
Пробовал изменять сетевой алиас сервера с MSSQL на его IP - первые несколько запросов отработали достаточно быстро, но, затем опять все работает очень медленно.
Вопрос.
Если у кого были подобные проблемы - поделитесь опытом решения. Или, возможно, я где-то туплю, то подскажите - где? Куда рыть?