首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP SQLSRV对sqlsrv_fetch_数组/sqlsrv_fetch有间歇性延迟

PHP SQLSRV对sqlsrv_fetch_数组/sqlsrv_fetch有间歇性延迟
EN

Stack Overflow用户
提问于 2016-04-26 15:43:45
回答 1查看 1.7K关注 0票数 5

我们将DB连接从ADODB切换到SQLSRV,我似乎对它有问题,使用sqlsrv_fetch_array会导致间歇性的延迟。

我在我的数据库中执行一个查询,返回大约426行和5个字段。

代码看起来如下(出于速度基准测试的目的,我真正删除了它正在做的任何事情):

代码语言:javascript
复制
$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);
}

使用ADODB运行此操作需要大约50 me。使用sqlsrv运行它需要500到1000 me。使用sqlsrv的原始查询(sqlsrv_query)实际上比ADODB快,但是sqlsrv_fetch_array存在随机时间延迟(我实际上用sqlsrv_fetch进行了测试并得到了它们)。我给它的每一个调用都计时在ms中,虽然每次调用通常是0-1ms,但有时可能高达15 ms。我之所以说它是随机的,是因为如果我多次重新运行代码,延迟将不会发生在同一个地方,并且会在数字上发生变化,所以这并不是因为一个特定的行是大的(它们都不是这样的)。

有没有人知道我能看到什么,可以这样做,不管是参数还是配置?我认为这与服务器/网络无关,因为ADODB从来没有这样做过。我们正在使用PHP5.6以及php_sqlsrv_56_ts.dll / php_pdo_sqlsrv_56_ts.dll和Server 2008。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-30 19:50:36

正如alalp在评论中所建议的,我尝试修改滚动类型,它解决了问题。

我做了一些快速测试,下面是我得到的:

SQLSRV_CURSOR_STATIC,SQLSRV_CURSOR_KEYSET和SQLSRV_CURSOR_DYNAMIC:严重的速度问题。正如在最初的文章中所指出的,即使是少量的记录(几个100次)也会占用一秒钟的时间。

SQLSRV_CURSOR_FORWARD:没有速度问题。我用了大约50 as来循环我的例子中的记录,这和ADODB是一样的。您失去了执行MoveFirst/MovePrev的能力,但我认为,如果需要,在第一次传递时将结果存储在数组中是很容易解决的,或者根据查询的不同,只在需要的情况下重新运行它可能会很好。

SQLSRV_CURSOR_CLIENT_BUFFERED:快速(在我的示例中为0MS,这是有意义的,因为据我理解,这与将整个事物存储在数组中基本相同)。不过,我们在一些较大的数据集中确实存在内存问题。

在我们的项目中,我们最后对公共网站使用了SQLSRV_CURSOR_CLIENT_BUFFERED,因为在一个页面中从来没有提取过主要的数据集,而在后端可以提取1000 s的数据行,所以使用SQLSRV_CURSOR_FORWARD。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36869716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档