如果我有out param,SQL查询速度很慢。

问题描述 投票:0回答:1

如果我只用SQLSRV_PARAM_IN参数来调用存储过程,那么我的脚本运行时间为1-3秒,查询到基础的时间不到1秒。

    $DocsCount = 0;
$query = "EXEC DBO.ElDocAllFTSWithPages @DocsCount = ?, @OffSet =?, @PerPage = ?, @FindStr = ?";
$params = array(
    array(&$DocsCount, SQLSRV_PARAM_OUT),
    array(&$start, SQLSRV_PARAM_IN),
    array(&$perPage->perpage, SQLSRV_PARAM_IN),
    array(&$searchtext, SQLSRV_PARAM_IN),
);
$stmt = sqlsrv_prepare($conn, $query, $params, array("Scrollable"=>"buffered"));
if( !$stmt ) {
    print "ERROR";
}
$result = sqlsrv_execute($stmt);
if( !$result ) {
    // show errors
}
$data = array();
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
    $data[] = $row;
}

我得到了完整的$DocsCount(查询中的总行数)和由$perpage限制行数的数组,但速度非常慢(20-40秒).如果我重写脚本和sql-query并删除数组(&$DocsCount, SQLSRV_PARAM_OUT),则运行1-3秒。但速度非常慢(20-40秒).如果我重写脚本和 sql-query 并删除数组(&$DocsCount, SQLSRV_PARAM_OUT),它可以运行1-3秒。

    $DocsCount = 0;
$start = 0;
$perpage = 500;

$sql = "EXEC DBO.ElDocAllFTSWithPages @OffSet =?, @PerPage = ?, @FindStr = ?";
$params = array(
    array(&$start, SQLSRV_PARAM_IN),
    array(&$perpage, SQLSRV_PARAM_IN),
    array(&$searchtext, SQLSRV_PARAM_IN),
);
$getsearchdocs = new GetSearchDocs();
$foundeddocs = $getsearchdocs->loadsearchdocs($sql,$params);

在sql server上,两个查询都运行1-2秒。

php sql sqlsrv
1个回答
0
投票

从文档中可以看到 https:/docs.microsoft.comen-ussqlconnectphpcursor-types-sqlsrv-driver?view=sql-server-ver15。

..buffered.. "Lets you access rows in any order. Creates a client-side cursor query."

我看不出在你的情况下为什么要建立这种类型的PHP连接。你正在向前循环,将结果存储在数组中,所以默认的游标 "向前 "就足够了。

问候。

© www.soinside.com 2019 - 2024. All rights reserved.