PHP - 为什么新的SQLSRV驱动程序比旧的mssql驱动程序更慢?

7

我有很多使用PHP旧版驱动程序mssql的组件。我希望切换到微软的新版驱动程序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


“old”和“new”具体指什么?我们正在谈论什么类型的活动?您是否使用预处理语句?有很多未知因素... - Erwin Moller
这可能与您的测试方法有关。测试数据库可能非常困难,因为查询缓存等问题。此外,您是否了解性能差异?请查看http://af-design.com/blog/2009/01/30/php-mysql-vs-mysqli-database-access-metrics/和“本地”https://dev59.com/FnVC5IYBdhLWcg3w1E1q。 - Nanne
我的测试方法很简单...一个查询,一个while循环将数据作为数组获取并在循环内部使用计数器。 - Kevin Labécot
但这是否是现实生活中使用的良好代表?例如,您如何考虑查询缓存? - Nanne
1
是的,这是一个真实的使用场景。我们有很多导出过程(没有分页:( )... 这种情况是真实存在的,并且非常频繁(一天多次)。我的+484,000的导出是使用我们最大客户的数据库进行测试。因此,对我来说尽快完成此过程非常重要。 - Kevin Labécot
我可以确认,使用PDO_ODBC比使用PDO_SQLSRV要快得多。由于我安装了64位的PHP 5.5.12,因此我使用了位于http://robsphp.blogspot.nl/2012/06/unofficial-microsoft-sql-server-driver.html的非官方64位SQLSRV驱动程序。一个简单的检索66条记录的查询需要大约500毫秒(PDO_ODBC),而需要大约5000毫秒(PDO_SQLSRV)。对于PDO_ODBC,我使用了多个ODBC驱动程序(SQL Server、SQL Server Native Client 11.0、ODBC Driver 11 for SQL Server),但所有驱动程序的速度都差不多。 - Jan
3个回答

2

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

1

我曾经遇到过与SQLSRV驱动程序类似的问题,最终解决方案是将选项“TraceOn”更改为“0”,这个配置可以防止驱动程序的跟踪。

更多详情请参见连接选项

示例:

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

1

为了加快获取速度,可以在sqlsrv_connect连接选项中使用"MultipleActiveResultSets"=>'0',最多可提高3倍速度。

例如:

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

            ));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接