问题描述
我想通过ODBC / pyODBC改善sql Select调用的性能。
这不是针对大型数据库(可能为1万行)的,而是从表中提取唯一记录(15列)。 15列的组合大小约为500字节)。我正在使用pyODBC
,并且正在使用fetchone
,最快可以将其降低到2秒左右。过去大约是3.5秒。我已将编码和解码设置为UTF-8以匹配数据库。我已确认交易级别为read_uncommitted。
我正在Unbuntu Linux上使用DataDirect ODBC驱动程序。
我似乎无法在2秒以下得到它,但是如果我从sql处理器(如db visualizer或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
来获得相同的查询性能,约为2秒。但是在任何sql处理器中运行此精确查询实际上都是立即的。
这绝对不是参数化字段,因为我实际上已经将值硬编码到where子句中,并且仍然需要2秒钟以上的时间来执行。
解决方法
基于对问题的评论中的讨论,尤其是
如果在iSQL中运行它-数据的结果会立即返回-就像立即显示出来的那样。但是光标又没有再返回2秒钟了。
和
但是,如果我从执行到获取的过程中分别提取3x,则字面意思是2s,2s,2s
驱动程序似乎检索了最后一行中的最后一个值,例如...
<v-btn
class="btn"
v-if="true"
icon
x-large
v-ripple="false"
:color="!drawer ? 'info' : 'warning'"
@click.stop='drawer = !drawer'>
<v-icon>{{ drawer ? 'far fa-compass' : 'fas fa-compass'}}</v-icon>
</v-btn>
.btn{
position: absolute;
top: 11%;
display: block;
right: -20%;
animation: pulse 3s linear reverse infinite;
animation-delay: 3s;
}
@keyframes pulse {
from {
transform: scale3d(1,1,1);
}
50% {
transform: scale3d(1.15,1.15,1.15);
}
to {
transform: scale3d(1,1);
}
}
...,然后再次调用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
...这就是引入〜2秒延迟的原因。
在我看来,这绝对像是驱动程序(或数据库)问题。