【问题标题】:PHP5 - SQLSRV too slowPHP5 - SQLSRV 太慢
【发布时间】:2017-10-31 12:24:53
【问题描述】:

我正在使用 sqlsrv 从 sql server 数据库中获取数据。该数据库位于 PHP 的不同服务器中(本地网络外)。

我使用包含大量 UNION 的查询。如果我在 Management Studio 上运行查询,获取所有数据大约需要 4-5 秒...但如果我使用 PHP 和 sqlsrv 大约需要 57 秒!

这是我正在使用的代码:

        $connectionInfo = array("Database"=>$db, "UID"=>$u, "PWD"=>$p, "CharacterSet"=>"UTF-8");
    $conn = sqlsrv_connect($serverName, $connectionInfo);
    $errors = sqlsrv_errors(SQLSRV_ERR_ERRORS);
    $tsql = $query;
    $stmt = sqlsrv_query($conn, $tsql, array(), array( "Scrollable" => 'static' ));
    $json = array();
            do {
                while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
                    $json[] = $row;                  
                }
                } while ( sqlsrv_next_result($stmt) );  
    echo json_encode($json);    

知道我做错了什么吗?

【问题讨论】:

  • 您发送和检索多少数据?如果数据库不是本地的,您会期望它需要更长的时间。要么不发送/返回尽可能多的数据,使用 sproc 或其他方法在 DB 上执行,要么将 DB 移动到打开 php exe 的机器上。
  • 您必须查看持续时间是否基于数据库处理时间(因此您必须编写更好的查询、设置索引、检查数据库服务器资源……)或网络传输时间(到很多数据,很多结果,网络争用,...)。
  • 我也有类似的问题。为了让 PHP 在 Linux 上工作,我必须安装 php7.2-sybase。当我使用 Microsoft SQL 工具时,我得到了非常快的响应时间。当我使用 PHP 时,我会遇到大量延迟和超时。所以要么 PHP 库坏了,要么驱动程序坏了。我认为其他两个 cmets 忽略的地方是它使用 Microsoft 工具的速度很快。不是大包,网络问题等等。你有没有设法解决这个问题?

标签: php sql-server sqlsrv


【解决方案1】:

试试这个代码:

$this->stmt = sqlsrv_query($this->conn, $sql, null, array( "Scrollable" => SQLSRV_CURSOR_FORWARD ));

SQLSRV_CURSOR_STATIC 允许您以任何顺序访问行,但不会反映数据库中的更改。 static 是 SQLSRV_CURSOR_STATIC 的缩写形式。

请看:https://docs.microsoft.com/en-us/sql/connect/php/cursor-types-sqlsrv-driver

【讨论】:

  • 请添加一些解释
  • 我英语说得不好。请看docs.microsoft.com/en-us/sql/connect/php/…
  • 它说 SQLSRV_CURSOR_STATIC 允许您以任何顺序访问行,但不会反映数据库中的更改。 static 是 SQLSRV_CURSOR_STATIC 的缩写形式。
  • 在我看来,如果您只向前访问结果数据,那么您最好选择向前游标模式。但是您不能使用 sqlsrv_num_rows。如果您想计算“选择查询”结果,请再进行一次计数查询。
  • 请将这些 cmets 添加到您的答案中,以便每个人都可以从中受益
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2012-02-02
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多