【问题标题】:Pyodbc slow on table with a million+ rowsPyodbc 在一百万多行的表上运行缓慢
【发布时间】:2017-06-28 11:34:33
【问题描述】:

问题是当使用 pyodbc 查询我的数据库时,可能需要大约一分钟才能返回我的数据。我数据库中的这个表在大约一百万行左右徘徊。我怎样才能加快速度?我已经尝试为表中的主要列设置值,但它仍然很慢。我也试过限制返回的数据无济于事。还有其他更快的东西吗?或者我可以改变一些东西以使以下速度更快吗?任何帮助将不胜感激!

这是我的代码:

import pyodbc

conn = pyodbc.connect(r'DSN=mydb;UID=myuserid;PWD=mypass')

class Visual(object):

  def get_resource_ids(self, *xargs):
    resource_ids = []
    cur = conn.cursor()
    cur.execute("select * from operation where status = 'C' and  workorder_type = 'W' and workorder_base_id = ? and workorder_lot_id = ? and workorder_split_id = ? and workorder_sub_id = ? and rownum <= 10", xargs[0], xargs[1], xargs[2], xargs[3])
    try:
      return [dict(count=str(index), resource_id=row[6]) for index, row in enumerate(cur, 1)]

    except ValueError:
      print "Error"
    finally:    
      cur.close()
      conn.close()

【问题讨论】:

  • 当您说“我也尝试过限制返回的数据”时,您的意思是您尝试仅检索感兴趣的列而不是 select *
  • 这是我正在做的限制返回的数据“rownum
  • 如果使用rownum &lt;= 10 的查询与没有该约束的查询一样长,那么“rownum”列显然没有被索引。 “操作”是表还是视图? “rownum”是实际列还是派生列?基础表是否对 WHERE 子句中包含的所有列都有索引?
  • 是的,where 子句中的每一列都有一个索引@GordThompson
  • 您使用的是什么数据库? IIRC 在我的 Oracle 时代,rownum 是一个不会阻止全表扫描的关键字。您是否对查询进行了EXPLAIN?我的猜测是它在你的表格设计中,而不是pyodbc

标签: python python-2.7 pyodbc


【解决方案1】:

基本上由于糟糕的表格设计,这是自己造成的,而不是 Pyodbc 问题。道德的故事设计表更好。

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    相关资源
    最近更新 更多