参数绑定是否在pymssql库中正确实现?

时间:2017-05-15 13:03:39

标签: python sql-server query-optimization sql-execution-plan pymssql

我使用pymsqsql库从Python程序调用非常简单的查询。

 with self.conn.cursor() as cursor:
     cursor.execute('select extra_id from mytable where id = %d', id)
     extra_id = cursor.fetchone()[0]

请注意,参数绑定的使用方法如pymssql documentation

中所述

参数绑定的主要目标之一是为DBMS引擎提供缓存查询计划的能力。我使用Profiler连接到MS SQL并检查了实际执行的查询。事实证明,每次执行一个唯一的语句(具有自己的绑定ID)。我还用这样的查询检查了查询用法:

select * from sys.dm_exec_cached_plans ec
cross apply
sys.dm_exec_sql_text(ec.plan_handle) txt
where  txt.text like '%select extra_id from mytable where id%'

它表明该计划没有被重用(当然,由于每个查询的唯一文本,这是可以预期的)。当从C#查询时,这与参数绑定有很大不同,当我们可以看到查询相同但提供的参数不同时。

所以我想知道我是否正确使用pymssql以及这个lib是否适合与MS SQL DBMS一起使用。

P.S。我知道MS SQL具有自动参数化功能,适用于基本查询,但不保证,并且可能不适用于复杂查询。

1 个答案:

答案 0 :(得分:2)

您正在使用pymssql。确实,在将查询发送到服务器之前,pymssql实际上确实将参数值替换为SQL文本。例如:

pymssql:

SELECT * FROM tablename WHERE id=1

pyodbc与Microsoft的SQL Server ODBC驱动程序(不是FreeTDS ODBC驱动程序):

exec sp_prepexec @p1 output,N'@P1 int',N'SELECT * FROM tablename WHERE id=@P1',1

但是,请记住pymssql基于FreeTDS,上述行为似乎是FreeTDS处理参数化查询的方式的函数,而不是pymssql 本身的特定功能。

是的,它可能会影响执行计划的重复使用(以及性能),如this answer所示。