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

问题描述

我想通过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秒延迟的原因。

在我看来,这绝对像是驱动程序(或数据库)问题。