首页 > 解决方案 > “sqlsrv_query”静态游标类型很慢

问题描述

我发现使用 PHP 与 MSSQL 数据库通信时,使用 sqlsrv_fetch_array() 的结果非常缓慢。使用 sqlsrv_query 和 "Scrollable" => "static" 允许我们在 35 秒内遍历 600 个项目的列表,而缓冲在 1 秒内完成。

只有一件事浮现在脑海中——这是另一台服务器上的远程数据库,使用静态游标需要我们每次都直接从数据库中获取结果。

或者这些查询从根本上破坏了一些东西。

作为参考,应用程序位于 Microsoft Azure 应用服务中,而数据库位于 Azure 中的“SQL 实例”中。但是,当我在本地 PC 上以调试模式运行应用程序时,我得到了类似的结果。

我不太热衷于改变“默认值”。

是什么导致了这个问题,解决方法是什么?还是在通过远程连接处理数据列表时使用缓冲游标是正确的解决方案?

标签: sqlsrv

解决方案


我可以确认使用静态游标需要更长的时间并且受 SQL 服务器上的工作负载的影响。例如,使用静态游标迭代包含近 14,000 条记录的结果集时,我可以获得的最佳时间是 14 秒。如果我们不使用静态游标并使用默认值,我们有时可以在不到一秒的时间内迭代相同的结果集。这是静态游标可以做到的最好的。我们有一些例子,从 SQL 服务器中提取所有行需要 30 秒、50 秒甚至超过一分钟。php 驱动程序似乎存在一个主要问题,至少直到并包括 17.8.1.1 和静态游标。 命令的结果 yum list installed msodbc*

作为记录,此 php 版本:PHP 7.3.23 (cli) (built: Sep 29 2020 08:33:03) (NTS) 版权所有 (c) 1997-2018 The PHP Group Zend Engine v3.3.23, 版权所有 (c) 1998-2018 Zend Technologies 与 Zend OPcache v7.3.23,版权所有 (c) 1999-2018,Zend Technologies

在 CentOS Linux 版本 7.8.2003 (Core) 上运行


推荐阅读