首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对db2数据库优化SQL/Python查询?

如何对db2数据库优化SQL/Python查询?
EN

Stack Overflow用户
提问于 2021-08-06 14:11:13
回答 1查看 284关注 0票数 0

通过Python连接到服务器上的db2数据库,并查询一个巨大的表(可能有200-mil记录,50-cols)。此表用于分析(OLAP可能是正确的术语),而不是事务。我想优化我的sql/python代码,以便更快地执行查询。

如果不深入了解sql查询,我怀疑SELECT语句从表的第一条记录开始,一直持续到查询满意为止。FETCH FIRST 10 ROWS ONLY在<1秒内执行。但是,包括WHERE date_col > 20210701在内,在识别前10条记录之前,需要扫描几条1亿条记录--这个查询需要超过几分钟的时间才能执行。通过游标对象的性能是相似的。

或者,我通过Microsoft连接到同一个表。Access中的同一日期查询在<5秒内执行--甚至比我最快的SELECT语句还要快。当然,Access是在幕后做一些我不知道的事情。

因此Access证明了这样一个概念,即这些sql查询可以快速执行。剩下的问题是:如何优化sql/python代码以匹配Microsoft的性能?谢谢大家。

代码语言:javascript
复制
import ibm_db_dbi as db
import pandas as pd 

cnxn = db.connect(dsn=     '********', 
                  user=    '********', 
                  password='********', 
                  host=    '********', 
                  database='********')   

cols = "{0}col1, {0}col2, {0}col3, {0}col4".format('database.')

# Executes in <1 second
fast_sql = '''SELECT {} FROM bigtable
              FETCH FIRST 10 ROWS ONLY'''.format(cols)

# Executes in ~5 seconds 
slower_sql = '''SELECT {} FROM bigtable
                WHERE col1 = 1234
                FETCH FIRST 10 ROWS ONLY'''.format(cols)

# Giving up after ~3 minutes
slowest_sql = '''SELECT {} FROM bigtable 
                       WHERE date_col > 20210701
                       FETCH FIRST 10 ROWS ONLY'''.format(cols) 

df = pd.read_sql_query(horribly_slow_sql , cnxn)

cnxn.close()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-09 21:09:36

有几个因素影响了这个问题。

  1. issue是一个简单的数据类型问题。date_col不是一个整数,也不是一个日期时间,而是一个CHAR格式。这导致索引问题,导致查询速度慢。通过将结果放入引号:...WHERE date_col > '20210701'而不是...WHERE date_col > 20210701.

来解决问题

  1. 另一个问题是对数据访问方式的误解。切换到“数据表视图”时,Access不会执行整个查询。相反,它执行相当于FETCH FIRST 50 ROWS ONLY的操作。查询速度如此之快,因为服务器不需要将整个数据集发送到客户端。但是,整个查询在导出时执行。在我的例子中,这大约需要5秒,并表示一个相当于我正在执行的Python脚本的进程。

谢谢大家以上的评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68683025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档