当前位置: 首页 > 知识库问答 >
问题:

Python SQL查询性能

凌运恒
2023-03-14

我正在使用jaydebeapi(Mac OS X)查询Netezza数据库,并执行一些快速/肮脏的计时:

t0 = time.time()
curs.execute('''select * from table1;''')
print time.time() - t0
t0 = time.time()
curs.execute('''select * from table1;''')
row = curs.fetchone()
while row is not None:
    row = curs.fetchone()
print time.time() - t0

完成大约需要10分钟(平均超过10次)。

现在,当我使用WinSQL(Windows7,ODBC)运行相同的SQL查询时,返回数据大约需要3分钟。我似乎不明白为什么在Python中要花这么长的时间,也不确定如何或从哪里开始寻找。

共有1个答案

沈高峻
2023-03-14

您是将JayDeBeApi与JPype结合使用还是与Jython一起使用?使用JPype实现获取大型结果集会导致对每个单元格值进行一些JNI调用,这会导致大量的开销。您应该考虑以下选项之一:

  1. 最小化ResultSet的大小。使用SQL函数进行聚合。
  2. 尝试一下JPype1的最新实现。性能有所提高。
  3. 将您的运行时切换到Jython(JayDeBeApi也在Jython上工作)
  4. 直接在Java中实现数据库查询和数据提取,并使用JPype调用逻辑,但接口不返回大型数据集。
  5. 尝试改进JPype和JayDeBeApi代码
 类似资料:
  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果

  • 问题内容: 我在繁忙的数据库上有一个存储过程,该数据库在某种程度上一直在昂贵的查询列表中排在首位。该查询非常简单,它采用单个参数(@ ID,int)作为表的主键,并选择与该ID匹配的记录。主键是带有聚簇索引的身份字段,所以我很困惑如何进一步优化它? 查询如下 不确定发布执行计划的最佳方法-显示的全部内容是聚集索引扫描占用了100%的操作 问题答案: 我认为通过使用您,您将获得次优的计划。将其分为2

  • 问题内容: 有人愿意帮助我吗?在具有10000行的MEMORY表上,以下查询大约需要18秒。如果我没有“ where”约束,则只需不到一分钟的时间。我已经打开查询缓存以及将其作为准备好的语句来尝试。有什么我可以做的吗?索引还是什么? 问题答案: 我认为这将为您提供所需的信息,而不管您关注的滚动日期范围…我已经通过创建带有两个标识列的自己的“发票”表进行了测试。使用@mySQL变量实际上非常简单,可

  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一

  • 问题内容: 我正在为创建的2个模型的终结点/项目的输出构建REST API: 项目: 参加者: 可以说,我有10个项目:(1个查询) 我遍历了所有10个人,但我也希望所有参与者: 因此,在循环结束时,Phalcon对每个项目进行了额外的查询。 这些查询是通过访问$ result->参与者进行的,同时迭代了10个项目: 题 有没有一种方法可以事先查询关系,因此将是一个查询。 当我使用Phalcon提

  • 问题内容: 我不太擅长SQL,因此我要求你们提供有关编写查询的帮助。 [SQL查询-表连接问题]https://codingdict.com/questions/208252) 我得到了答案,并且可以正常工作!它只是明显的缓慢。我讨厌这样做,但是我真的希望有人在那里推荐一些优化查询的方法。我什至没有自己尝试过,因为我对SQL不够了解,甚至无法开始使用谷歌搜索。 问题答案: 可能有帮助的是在要加入的