如何提高单行选择(即查找)的PyODBC性能



我想通过ODBC/pyODBC提高SQL Select调用的性能。

这不是针对大型数据库(可能是10K行(,从表中提取唯一记录(15列(。15列的组合大小约为500字节(。我使用pyODBC,使用fetchone,我所能达到的最快速度大约是2秒。过去大约需要3.5秒。我已经将编码和解码设置为UTF-8以匹配数据库。我已经确认事务级别为read_uncommitted。

我在Unbuntu Linux上使用DataDirect ODBC驱动程序。

我似乎无法在2秒以下得到它,但如果我从SQL处理器(如db可视化工具或dbeaver(运行它,行将在0.3到0.4秒内返回。这是一个非常简单的查询,其中包含一个唯一索引的where子句。没有外卡,不存在,等等

这只是pyodbc处理查询所需的最短时间吗?

query = 'select order_num, pick_ticket_num, package_id, ship_via, name, contact, address1, address2, address3, city, state, postal_code, country, phone from dbc.v_dmv5 where package_id = ?'  
cursor.execute(query, sqlArgs)
row = cursor.fetchone()

我还尝试使用turbodbc,这导致查询的性能级别相同,约为2s。但是,在任何sql处理器中运行这个精确的查询本质上都是即时的。

它也绝对不是参数化字段,因为我实际上已经在where子句中硬编码了一个值,执行它仍然需要2秒以上的时间。

基于问题评论中的讨论,尤其是

如果你在iSQL中运行它,数据的结果会立即返回,就像立即显示一样。但是光标再过两秒钟就不会回来了。

但如果我从执行到提取看fetchone 3x,它实际上是2s,2s,2t

似乎驱动程序检索最后一行中的最后一个值,例如。。。

so63171038      27b8-1b2c   EXIT  SQLGetData  with return code 0 (SQL_SUCCESS)
HSTMT               0x000000997E788440
UWORD                        2 
SWORD                       -8 <SQL_C_WCHAR>
PTR                 0x00000099746BD0A0 [       6] "bar"
SQLLEN                  4096
SQLLEN *            0x00000099722EE380 (6)

然后当它再次调用SQLFetch以查看是否有更多信息要检索(而没有(。。。

so63171038      27b8-1b2c   ENTER SQLFetch 
HSTMT               0x000000997E788440
so63171038      27b8-1b2c   EXIT  SQLFetch  with return code 100 (SQL_NO_DATA_FOUND)
HSTMT               0x000000997E788440

这就是引入约2秒延迟的原因。

对我来说,这绝对像是一个驱动程序(或者数据库(问题

相关内容

  • 没有找到相关文章

最新更新