【问题标题】:Python cx_Oracle query speedPython cx_Oracle 查询速度
【发布时间】:2020-07-09 08:00:57
【问题描述】:

问题

使用 cx_Oracle 用 python 查询我们的 Oracle 数据库需要很长时间。

方法

我使用 cx_Oracle 连接到 oracle db,并使用标准 SQL 行进行查询,例如:

select * from t1;

结果以 pandas 数据框的形式返回。

观察

  • 从 Spyder 和 Jupyter Notebook 查询同样慢。
  • 从 DBeaver 等 SQL 客户端查询返回结果的时间约为 1/10。

警告

当我在 cx-Oracle 查询中包含行限制时,我没有测试这是否成立。

【问题讨论】:

  • 你的问题有点笼统。如果没有其他信息(例如您正在查询什么数据以及您使用什么代码来查询它),我无法回答您的问题。在大多数情况下,我发现 cx_Oracle 的性能足够了,比等效的 C 程序要慢一些,但工作量要少得多。由于您使用的数据框暗示您使用的是 Pandas 之类的东西。也可以直接尝试使用 cx_Oracle。

标签: python oracle dataframe cx-oracle


【解决方案1】:

【讨论】:

    【解决方案2】:

    @Christopher Jones 和@Anthony Tuininga 指出了下一个级别的答案,以解决查询返回如此缓慢的原因。在我的#Caveat 部分,我注意到我没有

    WHERE rownum < 10
    

    在我的查询中。包括这确实减少了查询时间。我的错。

    还有一个类似的命令

    create table t1 as
    select *
    from table1
    

    导致即时反馈,因为没有从 db 收到任何内容。 这只是发出一个要求返回大量数据的查询的问题。 SQL 客户端内置了这些行限制,以防止像我这样的人提出这些问题! :)

    【讨论】:

      【解决方案3】:

      解决写入速度慢的问题

      写入 Oracle 时,默认情况下,所有属于 String 对象的 df 列都转换为 CLOB(字符大对象),最大长度为 2,147,483,647)。这意味着表格很可能比必要的大得多。

      在使用 df.to_sql 时,您通常会使用如下内容:

      df.to_sql("tablename"
              connection_string,
              schema='myschema',
              if_exists='replace',
              index=False
              )
      

      但是,省略可选参数 dtypes 可能会导致 CLOB。

      解决方案

      要克服这个问题,您可以手动提供 dtypes:

      df.to_sql("tablename"
              connection_string,
              schema='myschema',
              if_exists='replace',
              index=False,
              dtype={"RUN_DT": sa.types.DateTime(),
              "fname": sa.types.VARCHAR(length=50),
              "lname": sa.types.VARCHAR(length=250),
              "FROM_DT": sa.types.DateTime(),
              "TO_DT": sa.types.DateTime(),
              "UUID": sa.types.VARCHAR(length=50)}
              )
      

      更好的通用解决方案

      但是,如果您有很多表和很多列,并且需要一个通用的解决方案怎么办?

      @Parfait 在 SO here 上为这个问题提供了完美的解决方案。

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 2013-12-24
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多