Laravel DB facade连接Sqlserver查询极慢问题排查求助
环境信息
- Laravel 10.13.5
- apache2
- Ubuntu 22.04
- PHP 8.2.7 (cli) (built: Jun 8 2023 15:27:40) (NTS)
异常现象
通过Laravel DB Facade执行SQL Server查询时耗时超1分钟:
$data = DB::connection('sqlsrv') ->select('select * from my_table')
但直接使用php_pdo_sqlsrv原生方式执行相同查询,耗时不到5秒:
$serverName = "XX.XX.XXX.XX\INSTANCE, 1433"; $connectionInfo = ["Database"=>"my_database", "UID"=>"my_user", "PWD"=>"my_pwd"]; $conn = sqlsrv_connect($serverName, $connectionInfo); $sql = "SELECT * FROM my_table"; $result = sqlsrv_query($conn, $sql);
本地Windows+XAMPP环境(ODBC连接SQL Server)下,DB Facade查询无性能问题。
请问问题可能出在哪里?是apache2还是Laravel DB Class版本的问题?
Laravel数据库连接配置差异
检查config/database.php中sqlsrv连接的配置项,是否和原生sqlsrv_connect的参数完全一致。比如是否启用了Encrypt选项、是否指定了正确的实例名和端口,Laravel默认配置可能包含trust_server_certificate等额外参数,这些参数可能导致连接或查询阶段产生额外开销。PDO驱动与原生sqlsrv扩展的差异
Laravel的DB Facade默认使用PDO连接,而你原生测试用的是非PDO版本的sqlsrv扩展,两者底层实现有区别。可能存在PDO_SQLSRV驱动的性能适配问题,建议检查PHP环境中PDO_SQLSRV的版本是否为最新稳定版,也可以尝试在Laravel中直接使用原生sqlsrv扩展执行查询,对比耗时。Apache环境的PHP配置差异
本地Windows+XAMPP与线上Ubuntu+apache2的PHP配置可能不同。比如php.ini中pdo_sqlsrv.client_buffer_max_kb_size的设置,如果缓冲区过小,会导致查询结果分批读取,增加整体耗时。另外,apache的运行模式(如prefork、worker)也可能影响数据库连接的性能表现。Laravel对查询结果的封装处理
即使使用原生select语句,Laravel的DB Facade仍会将查询结果封装为集合对象,若my_table数据量极大,这一步的序列化处理可能显著增加耗时。可以尝试直接调用PDO原生方法查询,对比耗时:$pdo = DB::connection('sqlsrv')->getPdo(); $stmt = $pdo->query('select * from my_table'); $data = $stmt->fetchAll();网络与SQL Server端配置
检查Ubuntu服务器与SQL Server之间的网络是否存在延迟或丢包情况,虽然原生查询快,但Laravel的连接池或重试机制可能放大网络问题。另外,SQL Server是否对不同连接方式(PDO vs 原生sqlsrv)设置了不同的性能策略。
内容的提问来源于stack exchange,提问作者tapwater

