pymssql 库中是否正确实现了参数绑定?
Is parameter binding implemented correctly in pymssql library?
我正在使用 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 以及这个库是否适合与 MS SQL DBMS 一起使用。
P.S。我知道 MS SQL 具有适用于基本查询的自动参数化功能,但不能保证,并且可能不适用于复杂查询。
您正确使用了pymssql。确实,pymssql 在将查询发送到服务器之前确实将参数值替换为 SQL 文本。例如:
pymssql:
SELECT * FROM tablename WHERE id=1
带有用于 SQL 服务器的 Microsoft ODBC 驱动程序的 pyodbc(不是 FreeTDS ODBC 驱动程序):
exec sp_prepexec @p1 output,N'@P1 int',N'SELECT * FROM tablename WHERE id=@P1',1
但是,请记住 pymssql 是基于 FreeTDS 的,上述行为似乎是 FreeTDS 处理参数化查询的方式的函数,而不是 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 以及这个库是否适合与 MS SQL DBMS 一起使用。
P.S。我知道 MS SQL 具有适用于基本查询的自动参数化功能,但不能保证,并且可能不适用于复杂查询。
您正确使用了pymssql。确实,pymssql 在将查询发送到服务器之前确实将参数值替换为 SQL 文本。例如:
pymssql:
SELECT * FROM tablename WHERE id=1
带有用于 SQL 服务器的 Microsoft ODBC 驱动程序的 pyodbc(不是 FreeTDS ODBC 驱动程序):
exec sp_prepexec @p1 output,N'@P1 int',N'SELECT * FROM tablename WHERE id=@P1',1
但是,请记住 pymssql 是基于 FreeTDS 的,上述行为似乎是 FreeTDS 处理参数化查询的方式的函数,而不是 pymssql 的特定功能本身.
是的,它可能会对执行计划的重用(以及性能)产生影响,如