2013-10-08 3 views
0

У меня есть страница PHP, которая медленна всякий раз, когда идет запрос к базе данных MSSQL. Я использую последние PHP и стандартные SQL odbc драйверы для подключения к базе данных. При обращении к странице My SQL Profiler идет отображается crazy.The запрос затемMSSQL slow with PHP Query

exec sp_cursorfetch 180150003,2,1,1 
go 

выполняет около 240 раз, прежде чем, наконец,

exec sp_cursorclose 180150003 
go 

происходит, и отображается страница.

Trace log Screenshot

Это запрос вызывает головную боль:

<?php 
    $con = odbc_connect('Hesk','Trace_user','*******'); 
    $Assets = odbc_exec($con, "SELECT AssetName,   AssetID From viewAssets ORDER BY [AssetName];"); 
?> 
<table Border ="0" width="100%"> 
<tr> 
<td style="text-align:right" width="150"><?php echo $hesklang ['asset']; ?>: <font class="important"></font> 
</td> 
<td width = "80%"><select name ="asset"> 
<option value=""></option> 
<?php 
    while ($row = odbc_fetch_array($Assets)) 
    { 
    echo '<option value="' . $row['AssetID'] . '"' .   (($_SESSION['c_asset'] == $row['AssetID']) ? '    selected="selected"' : '') 
    . '>' . $row['AssetName']. '</option>'; 
    } 
    odbc_close($con); 
?> 
</select></td> 
</tr> 
</table> 

Любая идея, как мой код вызывает это производительность объемного содержания?

+1

Вы пытались использовать собственные драйверы mssql для PHP? http://php.net/manual/en/book.mssql.php – PaulProgrammer

+1

указатели на стороне сервера базы данных являются плохими для производительности ... –

+0

@PaulProgrammer Хмм может дать этим драйверам попробовать, обычно ли они с прилагаемыми драйверами odbc? – Tinydan

ответ

1

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

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

http://cct.me.ntut.edu.tw/ccteducation/chchting/aiahtm/computer/phphelp/function.odbc-connect.php.htm

+0

Приветствия, так что с двумя людьми, рассказывающими мне, что драйверы - проблема, я думаю, что они будут работой, чтобы обновить их завтра! – Tinydan

0

Try для измерения времени, когда проблема в связи или при выполнении запроса Если проблема заключается в связи, то изменить имя MSSQL для IP

$con = odbc_connect('Hesk','Trace_user','*******'); 

По какой-то причине мой линукс ящик был медленным на разрешения.

$con = odbc_connect('192.168.10.10','Trace_user','*******');