通过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的性能?谢谢大家。
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()发布于 2021-08-09 21:09:36
有几个因素影响了这个问题。
...WHERE date_col > '20210701'而不是...WHERE date_col > 20210701.来解决问题
FETCH FIRST 50 ROWS ONLY的操作。查询速度如此之快,因为服务器不需要将整个数据集发送到客户端。但是,整个查询在导出时执行。在我的例子中,这大约需要5秒,并表示一个相当于我正在执行的Python脚本的进程。谢谢大家以上的评论。
https://stackoverflow.com/questions/68683025
复制相似问题