pyodbc 在 sp_prepexec 之后调用 sp_unprepare。这会影响参数化查询的性能吗?

2023-12-04

继续

SqlAlchemy+pymssql。原始参数化查询会使用相同的执行计划吗?

我从 pymssql 切换到 pyodbc 尝试将参数化查询发送到 SQL Server。带有 Microsoft 驱动程序的 pyodbc 可以解决问题,但对我来说有些奇怪:

declare @p1 int
set @p1=6
exec sp_prepexec @p1 output,N'@P1 nvarchar(6),@P2 bigint,@P3 bigint,@P4 bigint',N'
                SELECT *
                FROM CC_sold
                WHERE id_contract =@P1
                    AND id_tip_cont=@P2
                    AND CC_sold.anul =@P3
                    AND CC_sold.luna =@P4
                ORDER BY CC_sold.anul, CC_sold.luna DESC
            ',N'176914',6,2016,9
select @p1
exec sp_unprepare 6

我的担忧与此声明有关:

exec sp_unprepare 6

如果我理解正确,这会取消查询执行计划,并且我不会从查询参数化中获得任何优化。是这样吗?


我做了一些测试,你不必担心。 pyodbc 只发送一个sp_unprepare(对于最后sp_prepexec执行)当cursor对象已关闭。也就是说,它不sp_unprepare every sp_prepexec它发送的。

此外,实际的计时测试揭示了 pyodbc(显然可以利用缓存的执行计划)和 pymssql(显然不能)之间的性能差异。使用以下代码...

crsr = conn.cursor()
crsr.execute("DBCC FREEPROCCACHE")
if 'pyodbc' in repr(conn):
    sql = "SELECT COUNT(*) AS n FROM table1 WHERE cola=? AND colb=? AND colc=? AND cold=?"
else:
    sql = "SELECT COUNT(*) AS n FROM table1 WHERE cola=%s AND colb=%s AND colc=%s AND cold=%s"
t0 = time.time()
limit = 10
for a in range(limit):
    for b in range(limit):
        for c in range(limit):
            for d in range(limit):
                params = (a, b, c, d)
                crsr.execute(sql, params)
                n = crsr.fetchone()[0]
print(time.time() - t0)
crsr.close()
conn.close()

... for limit = 10四 (4) 个嵌套for循环总共运行 10,000 个查询。在我的具有本地 SQL Server 实例的 Windows 测试机器上,pymssql 需要大约 130 秒(仅 2 分钟多一点)执行,而 pyodbc 在 5 秒内始终运行相同的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyodbc 在 sp_prepexec 之后调用 sp_unprepare。这会影响参数化查询的性能吗? 的相关文章

  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo

随机推荐

  • xslt 删除重复元素

    我正在尝试从此文件中删除具有相同 href 属性的元素
  • Mac应用程序在/etc/hosts文件之间切换,如何允许访问?

    我正在制作一个小型 mac 菜单应用程序 以在我拥有的主机文件之间快速切换 以便在我的网络环境之间切换 try FileManager default copyItem at URL fileURLWithPath etc hosts EN
  • 如何在原生拖动事件后获取 mouseup 事件?

    WHATWG 的实施拖放支持dragstart drag and dragend事件 The dragend当可拖动对象返回到原始位置时触发事件 例如尝试将红色框拖动到尽可能远的位置然后释放它 这dragend 和 结束 console l
  • DriveFolder.listChildren() 未显示其所有子项

    我正在制作一个与谷歌驱动器一起使用的应用程序 我需要获取文件夹内所有文件的列表 但似乎不可能 当我调用 listFiles 方法 时 我无法获取 DriveFolder 内的所有文件 但不仅如此 在我得到的文件列表中 还有一些我之前删除的文
  • 获取 Azure 服务总线中的消息统计信息

    我正在编写一个实用程序来监视我们的 Azure 服务总线主题和订阅 我可以获得主题详细信息 例如名称 排队消息计数和死信消息计数 但我想获取已处理的消息数 这是我正在使用的代码 var sub namespaceManager GetSub
  • 使用“print”时语法无效? [复制]

    这个问题在这里已经有答案了 我正在学习 Python 甚至无法编写第一个示例 print 2 100 这给出了SyntaxError invalid syntax 指着2 为什么是这样 我用的是3 1版本 那是因为在 Python 3 中
  • Android SimpleCursorAdapter 没有这样的列 Id

    我有一个 Listview 我想用 SQLite 数据库中的信息填充它 这似乎是最实用的解决方案 在我的调试器中 它说这是由以下原因引起的 IllegalArgumentException 没有这样的列 身份证不存在 这是我试图填充它的ja
  • 使用 .net WebApi 的包含图像的 HTML 页面

    我正在使用 net Web Api 通过 JSON 数据公开不同的端点 现在我需要特定端点返回 HTML 页面 我是这样实现的 HttpGet Route htmlPage htmlPageId public HttpResponseMes
  • 为什么 URL 位于 XML 命名空间中?

    以这一行为例
  • 如何为我的 git 存储库设置默认别名或其他配置?

    我想为 git 存储库设置一些默认别名和其他配置 以便当新用户克隆它时 他们可以在该项目中立即使用这些别名 即 我想做 git clone
  • 与 cloudFront 中的最小、最大和默认 TTL 混淆

    我的 Web 应用程序位于 S3 中 并使用 cloudFront 的 Web 发行版为该应用程序提供服务 我给了官方文档读过 但对很多术语感到困惑 我的问题 我想将cloudFront缓存设置为最长1年 365天 为此 我需要做什么 我们
  • 扩展 CodeIgniter 中的模型

    好吧 我是 CodeIgniter 框架的新手 我正在尝试构建一个通用模型类 看 class Basic Model extends CI MODEL function construct Call the Model constructo
  • 如何使用 AWS Cognito 限制自定义 api 访问

    我在我的应用程序中使用 Spring Boot 在搜索一些 IAM 工具时 我实际上很喜欢 Auth0 但我负担不起他们的定价 所以 我找到了另一个叫AWS Cognito 下面是Auth0来限制我们自定义的访问api https auth
  • 如何使用 python 从 Azure Cosmos DB 读取数据

    我有一个 Azure 试用帐户 并将一些 JSON 文件上传到 CosmosDB 中 我正在创建一个 python 程序来查看数据 但我在这样做时遇到了困难 这是我到目前为止的代码 import pydocumentdb documents
  • Android Studio Logcat 过滤器不显示

    我在 Ubuntu 13 10 上使用 AndroidStudio 0 4 0 在 0 3 2 上遇到同样的问题 一切都很好 直到我在 Android 和 ddms ddms 视图中丢失了 logcat 过滤实用程序和设备选择侧栏 然而 程
  • Facebook android sdk如何获取给定页面的点赞数

    我想获取给定页面及其 id 的点赞数 这里是图形API请求我想用 facebook android sdk 进行翻译 我不知道如何制作它 如果我尝试 我会收到错误 Bundle params new Bundle params putStr
  • 如何在 Chrome 中播放 .avi 文件格式的视频?

    从技术上讲 可以通过直接在 HTML 中加载外部播放器的嵌入对象来播放 avi 文件 现在铬已弃用该功能和解决方案将我的所有视频文件转码为 mp4 Edited因为我不拥有这些文件 所以我不会假装对它们进行转码 我期待着一种方法来重新启用旧
  • 将坐标外推到画布对象的边缘

    我正在编写一个浏览器应用程序 试图发现图像中的兴趣点 一旦我计算出这些点 我就会在它们之间画一条线 我的应用程序需要将这些线条推断到画布的边缘 有谁有 javascript 中线性图计算的经验吗 我已经进行了演示 function func
  • 以编程方式在闪亮仪表板中切换侧边栏菜单的显示

    我正在使用 R 闪亮仪表板 想知道是否可以使用附加按钮折叠 显示侧边栏 就像侧边栏顶部已有的按钮一样 那可能吗 Cheers 您可以通过以下方式向正文添加 删除所需的 css 类shinyjs library shiny library s
  • pyodbc 在 sp_prepexec 之后调用 sp_unprepare。这会影响参数化查询的性能吗?

    继续 SqlAlchemy pymssql 原始参数化查询会使用相同的执行计划吗 我从 pymssql 切换到 pyodbc 尝试将参数化查询发送到 SQL Server 带有 Microsoft 驱动程序的 pyodbc 可以解决问题 但