如果没有参数,则执行慢速sql查询

vlju58qv  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(307)

如果我只使用params中的sqlsrv\u param\u调用存储过程,那么我的脚本将以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;
}

我得到succfulll$docscont(查询中的总行数)和行数受$perpage限制的数组。但是非常慢(20-40秒)。如果我重写脚本和sql查询并删除数组(&$docscont,sqlsrv\u param\u 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秒。

l7mqbcuq

l7mqbcuq1#

从文件上https://docs.microsoft.com/en-us/sql/connect/php/cursor-types-sqlsrv-driver?view=sql-server-ver15

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

在您的情况下,我看不出建立这种类型的php连接的原因。您正在向前循环,将结果存储在数组中,因此默认的光标“forward”就足够了。
当做,

相关问题