You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:57:10