PHP - 为啥新的 SQLSRV 驱动程序比旧的 mssql 驱动程序慢?

Posted

技术标签:

【中文标题】PHP - 为啥新的 SQLSRV 驱动程序比旧的 mssql 驱动程序慢?【英文标题】:PHP - Why is new SQLSRV driver slower than the old mssql driver?PHP - 为什么新的 SQLSRV 驱动程序比旧的 mssql 驱动程序慢? 【发布时间】:2012-08-03 06:52:28 【问题描述】:

我有很多组件使用 php 中的旧驱动程序 mssql。 我想切换到 Microsoft 的新驱动程序 SQLSRV,但我的查询速度要慢很多。

我有许多进程处理 +400 000 行。

这是我对 40 000 行的测试:

testOldDriver_mssql = 行 40000:1 秒 testNewDriver_nonPDO = 第 40000 行:7 秒 testNewDriver_PDO = 第 40000 行:4 秒

这是我最大的过程(+480 000 行):

testOldDriver_mssql = 行 484856:27 秒 testNewDriver_nonPDO = 行 484856:120 秒 testNewDriver_PDO = 行 484856:47 秒 testPDO_ODBC = 行 484856:24 秒

新驱动程序肯定更慢吗?还是我错过了什么?

编辑 1:

“旧驱动程序”是指已弃用的 MSSQL 库(请参阅 php.net/mssql)。

新的驱动是微软直接制造的(见http://www.microsoft.com/en-us/download/details.aspx?id=20098)

我的查询是

SELECT * FROM myTable 
WHERE pdvSaisie IN 
       (SELECT number FROM pdvs WHERE nom LIKE 'ZUEE %') 

并使用直接query()(如果我使用准备好的语句,则没有准备和相同的结果)。

编辑 2:

添加了 PDO/ODBC 测试。惊喜,它更快:o

【问题讨论】:

“旧”和“新”到底是什么意思?我们在谈论什么样的活动?你使用准备好的语句吗?很多未知数... 谢谢,我编辑了我的原始信息。 这取决于您的测试方法吗?测试数据库可能非常困难,查询缓存一直在进行。另外,您是否阅读过性能差异?检查af-design.com/blog/2009/01/30/… 和“本地”***.com/questions/171400/… 我的测试方法很简单......一个查询,一个while循环将数据作为数组和一个计数器在我的循环中获取。 是的,这是现实生活中的用法。我们有很多导出过程(没有分页:()...这种情况是真实的并且经常发生(一天很多次)。我的 +484 000 导出是使用一个或我们最大客户的数据库进行的测试. 这就是为什么尽快完成这个过程对我来说非常重要。 【参考方案1】:

已知错误: http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/6c4d2c96-6ddc-4872-a5b6-51daddf3a095/

解决方法:使用 PDO/ODBC。

【讨论】:

在 Windows 上将 PDO/ODBC 与 SQL Native Client 一起使用时的注意事项:比较日期数据类型(时间戳等)时,此设置似乎很难,所以我发现的最简单的方法是在适当的地方或在存储过程中将它们转换为查询(CAST(? AS DATE))中的日期,确保输入的“日期”参数是 varchar,并允许 SQL 服务器在服务器端的比较中进行隐式转换。【参考方案2】:

为了加快获取速度高达 3 倍,请在您的 sqlsrv_connect 连接选项中使用 "MultipleActiveResultSets"=>'0'

例如:

$db = sqlsrv_connect('127.0.0.1', array('Database'=>'dbname','UID'=> 'sa','PWD'=> 'pass',"CharacterSet" =>"UTF-8","ConnectionPooling" => "1"
                    ,"MultipleActiveResultSets"=>'0'

            ));

【讨论】:

【参考方案3】:

我的驱动程序 SQLSRV 也有类似的问题,我的最终解决方案是将选项“TraceOn”更改为“0”,此配置会阻止驱动程序的跟踪。

更多详情请见Connection Options

例子:

$connectionInfo = array( "Database"=>"dbName", "TraceOn" => "0");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

【讨论】:

以上是关于PHP - 为啥新的 SQLSRV 驱动程序比旧的 mssql 驱动程序慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 NULL 左外连接使用 sqlsrv_fetch_array 在 PHP 中停止数据集导航?

为啥 locationmanager 使用新的 gettime-timestamp 返回旧的位置修复?

PHP 7 SQLSRV 驱动程序不加载

为啥在较新的 Android 设备上预检失败,但在较旧的设备和台式机上却没有?

SQLSRV 驱动程序与带有 MS SQL Server 的 PHP 的 PDO 驱动程序

为啥 M1 Max 上的原生 Python 比旧 Intel i5 上的 Python 慢得多?