use*_*224 3 php performance adodb sqlsrv
我们将数据库连接从 ADODB 切换到 SQLSRV,我似乎遇到了问题,导致使用 sqlsrv_fetch_array 出现间歇性延迟。
我在我的数据库中做了一个查询,返回大约 426 行,包含 5 个字段。
代码看起来像这样(为了速度基准测试,我真的删除了它正在做的任何其他事情):
$conn = sqlsrv_connect( $host, array("UID"=>$userName,"PWD"=>$password,"Database"=>$dbName,"QuotedId"=>false, "CharacterSet" =>"UTF-8");
$rsText=sqlsrv_query($conn,$sqlStr,array(),
array(
"Scrollable"=>SQLSRV_CURSOR_STATIC
));
$row = array(1);
while(count($row) != 0){
$row=sqlsrv_fetch_array($rsText,SQLSRV_FETCH_BOTH, SQLSRV_SCROLL_NEXT);
}
Run Code Online (Sandbox Code Playgroud)
使用 ADODB 运行它需要大约 50 毫秒。使用 sqlsrv 运行它需要 500-1000 毫秒。使用 sqlsrv 的原始查询 (sqlsrv_query) 实际上比 ADODB 更快,但是 sqlsrv_fetch_array 存在随机时间延迟(我实际上使用 sqlsrv_fetch 进行了测试,也得到了它们)。我每次调用它都以毫秒为单位计时,虽然每次调用通常是 0-1 毫秒,但有时它会长达 15 毫秒。为什么我说它是随机的,因为如果我多次重新运行代码,延迟不会发生在同一个地方,并且数量会有所不同,所以这不是因为特定行很大(它们都不是) .
有没有人知道我可以看到什么可以做这件事,无论是某个地方的参数还是配置?我认为 ADODB 从不这样做,这与服务器/网络无关。我们使用 PHP 5.6 和 php_sqlsrv_56_ts.dll / php_pdo_sqlsrv_56_ts.dll 和 SQL Server 2008。
谢谢!
正如 alalp 在评论中所建议的,我尝试修改滚动类型并解决了问题。
我做了一些快速基准测试,这是我得到的:
SQLSRV_CURSOR_STATIC、SQLSRV_CURSOR_KEYSET 和 SQLSRV_CURSOR_DYNAMIC:严重的速度问题。正如原始帖子中所述,即使循环中等数量的记录(少数 100 条)也需要一秒钟的时间。
SQLSRV_CURSOR_FORWARD:没有速度问题。用了大约 50 毫秒来遍历我的示例中的记录,这与 ADODB 相同。您失去了执行 MoveFirst/MovePrev 的能力,但我认为如果需要,可以通过在第一次传递时将结果存储在数组中轻松解决这个问题,或者根据查询,在极少数情况下重新运行它可能很好必需的。
SQLSRV_CURSOR_CLIENT_BUFFERED:极快(在我的示例中为 0ms,这是有道理的,因为根据我的理解,它与将整个事物存储在数组中基本相同)。不过,我们确实在一些较大的数据集中遇到了内存问题。
在我们的项目中,我们最终将 SQLSRV_CURSOR_CLIENT_BUFFERED 用于公共网站,因为从来没有在一页中提取过主要数据集,而 SQLSRV_CURSOR_FORWARD 用于后端,您最终可以提取 1000 行数据。