SqlAlchemy+pymssql。原始参数化查询会使用相同的执行计划吗?

SqlAlchemy+pymssql. Will raw parametrized queries use same execution plan?

在我的应用程序中,我有这样的参数化查询:

res = db_connection.execute(text("""
        SELECT * FROM Luna_gestiune WHERE id_filiala = :id_filiala AND  anul=:anul AND luna = :luna
        """), 
     id_filiala=6, anul=2010, luna=7).fetchone()

如果我 运行 使用不同的参数值在循环中,这样的查询会使用相同的查询执行计划吗?

好像不太可能。 pymssql 使用 FreeTDS,FreeTDS 在将查询发送到服务器之前执行参数替换 ,这与其他一些分别发送查询 "template" 和参数的机制不同(例如,pyodbc with Microsoft 的 ODBC 驱动程序,如 ).

中所述

也就是说,对于你在问题中描述的查询,pymssql/FreeTDS不会发送像

这样的查询字符串
SELECT * FROM Luna_gestiune WHERE id_filiala = @P1 AND anul = @P2 AND luna = @P3

以及@P1 = 6、@P2 = 2010 等的单独值。相反,它将首先构建文字查询,然后发送

SELECT * FROM Luna_gestiune WHERE id_filiala = 6 AND anul = 2010 AND luna = 7

因此,对于您发送的每个参数化查询,SQL 命令文本会有所不同,我的理解是,如果当前命令文本为 [=24],数据库引擎只会重新使用缓存的执行计划=]与缓存版本相同。

编辑: 随后的测试证实 pymssql 显然 不会 重新使用缓存的执行计划。 .

中的详细信息