Python通过pyodbc连接Azure SQL执行查询时进程挂起求助
解决建议
1. 升级ODBC驱动版本
你当前使用的ODBC Driver 13版本较旧,Azure SQL官方推荐使用ODBC Driver 18 for SQL Server。旧驱动可能因Azure SQL的兼容性更新出现连接或执行异常,升级驱动后重新测试。
2. 调整连接字符串参数
Azure SQL要求加密连接,之前的隐式设置可能因环境变化失效,修改连接字符串添加强制加密参数:
db_name = "<databaseName>" conn_str = f'Driver={{ODBC Driver 18 for SQL Server}};Server=<servername>;Database={db_name};UID=<user>;PWD=<pwd>;Encrypt=yes;TrustServerCertificate=no;' conn = pyodbc.connect(conn_str, timeout=180)
同时避免直接拼接数据库名字符串,改用格式化字符串减少语法风险。
3. 排查执行计划差异
SSMS与Python的执行环境默认配置不同,可能导致执行计划偏差:
- 在SSMS中执行
SET SHOWPLAN_XML ON;后运行查询,导出执行计划;在Python中先执行conn.execute("SET SHOWPLAN_XML ON;")再运行查询,对比两者的执行计划是否一致,排查参数嗅探或缓存问题。 - 强制重新生成执行计划,修改查询:
sqlQuery = "SELECT * FROM [dbo].[viewName] ORDER BY ST OPTION (RECOMPILE);"
4. 测试小批量数据读取
先限制返回数据量,验证是否为全量数据传输问题:
- 执行
SELECT TOP 100 * FROM [dbo].[viewName] ORDER BY ST;,若能正常返回,说明可能是大结果集处理或特殊数据类型(如大文本、二进制)导致的卡顿,可尝试只查询部分字段测试。 - 分批次读取数据,避免一次性加载全量:
chunk_size = 10000 chunks = pd.read_sql_query(sqlQuery, conn, chunksize=chunk_size) df = pd.concat(chunks)
5. 检查数据库与网络状态
- 登录Azure门户查看数据库监控面板,确认是否存在CPU、内存、IO等资源瓶颈。
- 测试Python所在机器到Azure SQL的网络连通性,用
telnet <servername> 1433或PowerShell命令Test-NetConnection <servername> -Port 1433检查端口是否正常,排查防火墙规则临时变更。
6. 回退依赖包版本
两天前正常运行,可能是pyodbc或pandas版本更新引发兼容性问题:
- 回退pyodbc到稳定旧版本,例如:
pip install pyodbc==4.0.39 - 回退pandas到之前的版本,例如:
pip install pandas==2.0.3
内容的提问来源于stack exchange,提问作者Mr Paul
相关产品推荐
相关产品推荐

