如果我只使用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秒。
1条答案
按热度按时间l7mqbcuq1#
从文件上https://docs.microsoft.com/en-us/sql/connect/php/cursor-types-sqlsrv-driver?view=sql-server-ver15
在您的情况下,我看不出建立这种类型的php连接的原因。您正在向前循环,将结果存储在数组中,因此默认的光标“forward”就足够了。
当做,