在我的应用程序中,我有这样的参数化查询:
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()
如果我在具有不同参数值的循环中运行它,这样的查询是否会使用相同的查询执行计划?
答案 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。