MSSQL在PHP Query中运行缓慢

时间:2013-10-08 16:09:21

标签: php sql sql-server

我有一个PHP页面,每当它查询MSSQL数据库时都很慢。我正在使用最新的PHP和标准的SQL odbc驱动程序连接到数据库。访问页面时我的sql profiler变得疯狂。然后显示查询

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 个答案:

答案 0 :(得分: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