SQLAlchemy的+ pymssql。原始参数化查询是否使用相同的执行计划?

时间:2016-10-18 09:02:42

标签: python sqlalchemy pymssql

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

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()

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

1 个答案:

答案 0 :(得分:0)

似乎不太可能。 pymssql使用FreeTDS,FreeTDS在向服务器发送查询之前执行参数替换,这与发送查询"模板"的其他机制不同。和参数分开(例如,pyodbc与Microsoft的ODBC驱动程序,如this answer中所述)。

也就是说,对于您在问题中描述的查询,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命令文本将不同,我的理解是,如果当前命令文本相同,数据库引擎将仅重用缓存的执行计划缓存版本。

编辑:后续测试确认pymssql显然没有重新使用缓存的执行计划。详情请见this answer