我想通过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秒延迟的原因。
对我来说,这绝对像是一个驱动程序(或者数据库(问题