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 显然 不会 重新使用缓存的执行计划。 .
中的详细信息
在我的应用程序中,我有这样的参数化查询:
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 显然 不会 重新使用缓存的执行计划。