如何针对 db2 数据库优化 SQL/Python 选择查询?

     2023-03-22     114

关键词:

【中文标题】如何针对 db2 数据库优化 SQL/Python 选择查询?【英文标题】:How to optimize SQL/Python select queries against a db2 database? 【发布时间】:2021-08-06 14:11:13 【问题描述】:

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

没有深入了解sql查询,我的怀疑是SELECT语句从表的第一条记录开始,一直持续到满足查询为止。 FETCH FIRST 10 ROWS ONLY 在 WHERE date_col > 20210701 需要在识别前 10 条记录之前扫描几条 1 亿条记录——执行此查询需要几分钟以上的时间。通过游标对象的性能类似。

或者,我通过 Microsoft Access 连接到同一个表。 Access 中相同的日期查询在 <.5>SELECT 语句还要快。 Access 肯定在幕后做着我不知道的事情。

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

import ibm_db_dbi as db
import pandas as pd 

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

cols = "0col1, 0col2, 0col3, 0col4".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()

【问题讨论】:

您需要查看在每种情况下实际发送到数据库服务器的查询。另外,您如何衡量执行时间? 任何索引?有关表设计的任何信息? date_col 是什么类型?从一些性能基础开始,即在可重现的环境中收集事实。 “mil”是指几百万还是几千? @mustaccio 如何找到从 Microsoft Access 发送到数据库的实际 sql?到目前为止,谷歌没有帮助。有什么想法吗? @data_henrik 感谢您的回复。通过访问探索“对象定义”属性表明有 7 个索引。不过它们有点神秘,所以我不确定它们实际上是如何传递到 Access 的 sql 查询中的。不过,这是一个很好的起点。 【参考方案1】:

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

    最重要的是一个简单的数据类型问题。 date_col 不是整数也不是日期时间,而是 CHAR 格式。这导致了索引问题,导致查询缓慢。通过将结果放在引号中解决了问题:...WHERE date_col &gt; '20210701' 而不是 ...WHERE date_col &gt; 20210701

    另一个问题是对 Access 如何处理数据的误解。切换到“数据表视图”时,Access 不会执行整个查询。相反,它执行与FETCH FIRST 50 ROWS ONLY 等效的操作。查询出现得如此之快,因为服务器不需要将整个数据集发送给客户端。但是,导出时会执行整个查询。在我的例子中,这大约需要 5 秒,代表一个相当于我正在执行的 Python 脚本的过程。

谢谢大家的上述cmets。

【讨论】:

数据库优化

优化1——数据库优化面试题分类: 数据库优化1.实践中如何优化mysql1) SQL语句及索引的优化2) 数据库表结构的优化3) 系统配置的优化4) 硬件优化 2.索引的底层实现原理和优化在 DB2 数据库中索引采用... 查看详情

从代码层面优化系统性能应该怎么做?

...服务器环境服务器配置:4核CPU,8G内存,共4台MQ:RabbitMQ数据库:DB2SOA框架:公司内部封装的Dubbo缓存框架:Redis、Memcached统一配置管理系统:公司内部开发的系统问题描述单台40TPS,加到4台服务器能到60TP 查看详情

如何优化这个 DB2 Query Where 子句?

】如何优化这个DB2QueryWhere子句?【英文标题】:HowdoIoptimizethisDB2QueryWhereClause?【发布时间】:2018-03-2219:18:46【问题描述】:我在这里有一个查询,用于查找授权给项目的用户,它是以人类可读的方式编写的,但是我希望优化一个... 查看详情

零零好车代码层面优化系统开发性能应该怎么做?

...服务器环境服务器配置:4核CPU,8G内存,共4台MQ:RabbitMQ数据库:DB2SOA框架:公司内部封装的Dubbo缓存框架:Redis、Memcached统一配置管理系统:公司内部开发的系统系统开发谢天华135-0148 查看详情

如何针对 Oracle 优化此查询

】如何针对Oracle优化此查询【英文标题】:HowtooptimizethisqueryforOracle【发布时间】:2018-10-1314:41:59【问题描述】:我正在学习使用索引、索引簇、哈希簇等结构进行查询优化。我有一张桌子客户和预订。我需要优化2个查询查询1:... 查看详情

DB2 查询优化

】DB2查询优化【英文标题】:DB2Queryoptimization【发布时间】:2016-04-0617:19:36【问题描述】:全部,在优化查询方面需要帮助:有以下两个表格:表1AdminIdPolicyLocationidCreateTimestamp表2AdminId策略CreateTimestampDetail1Detail2。详情50表2是一个... 查看详情

如何针对触控设备优化网站

】如何针对触控设备优化网站【英文标题】:Howtooptimizewebsitefortouchdevices【发布时间】:2011-02-0603:02:53【问题描述】:在iPhone/iPad/Android等触控设备上,您可能很难用手指点击一个小按钮。据我所知,没有跨浏览器的方式来检测带... 查看详情

java示例代码_这段代码还能如何针对防御编程进行优化

java示例代码_这段代码还能如何针对防御编程进行优化 查看详情

如何针对大型表优化我的 RAND() 函数? [复制]

】如何针对大型表优化我的RAND()函数?[复制]【英文标题】:HowdoIoptimizemyRAND()functionforlargetables?[duplicate]【发布时间】:2014-05-3103:19:19【问题描述】:我需要从一张桌子上随机获取20张图片我当前的查询是SELECT*FROMfooORDERBYRAND()LIMIT2... 查看详情

如何优化缓存架构?--针对于热key问题

...化时进行感知。此时系统层就可以立刻把相关缓存数据从数据库加载,然后存放在本地缓存。这个本地缓存,主要说的就是将缓存集群里的集中式缓存,直接变成每个系统自己本地实现缓存即可,每个系统自己本地是无法缓存 查看详情

Mysql INSERT 操作如何针对可能的重复条目进行优化?

】MysqlINSERT操作如何针对可能的重复条目进行优化?【英文标题】:HowcanMysqlINSERToperationsbeoptimizedforpossibleduplicateentries?【发布时间】:2016-10-2812:08:38【问题描述】:在我的NodeJs应用程序中,我使用线程(由我自己定义)来打开计... 查看详情

如何针对低分辨率/模糊素材优化 OpenCV 的 Canny 边缘检测

】如何针对低分辨率/模糊素材优化OpenCV的Canny边缘检测【英文标题】:HowcanIoptimizeOpenCV\'sCannyedgedetectionforlowresolution/blurryfootage【发布时间】:2016-10-1812:50:47【问题描述】:我有低分辨率的模糊灰度图像,并且针对它运行精明的边... 查看详情

如何针对构建持续时间和 RAM 使用优化 gradle 构建性能?

】如何针对构建持续时间和RAM使用优化gradle构建性能?【英文标题】:HowtooptimizegradlebuildperformanceregardingbuilddurationandRAMusage?【发布时间】:2012-04-0604:48:17【问题描述】:我目前正在为我的多模块Web应用程序从ant切换到gradle,目前... 查看详情

如何编写编译器可以针对 SIMD 比较优化的代码? [复制]

】如何编写编译器可以针对SIMD比较优化的代码?[复制]【英文标题】:HowtowritecodethatcompilercanoptimizetoSIMDcompare?[duplicate]【发布时间】:2018-03-0309:32:21【问题描述】:std::array<int,4>a=1,1,1,1;std::array<int,4>b=1,2,3,4;std::array<int,4... 查看详情

db2数据库表数据量太大如何横向拆分

...empty.del】的文件,此文件是空文件(2)、命令行连接DB2数据库DB2connecttoTEST_36USERadministratorusingpassword(3)、执行删除DB2importfromempty.delofdelreplaceintotable_name本回答被提问者和网友采纳 参考技术B虽然不知道对数据做横向拆分有何意... 查看详情

如何仅针对工作执行应用程序优化 build.xml 文件

】如何仅针对工作执行应用程序优化build.xml文件【英文标题】:Howtorefinebuild.xmlfileonlyforworkexecutionapp【发布时间】:2015-12-0111:02:11【问题描述】:在maximo内部,我们有4个应用程序,我只想构建和部署其中的工作执行应用程序。目... 查看详情

【db2】sql优化

...精力去解决问题。1.去除在谓词列上编写的任何标量函数优化前:(耗时3.1s)优化后:(耗时0.922s)总结:DB2可以选择使用START_DATE上的列索引,但是在列上使用了函数后,DB2就无法使用列索引了,从而导致查询效率变低。2.去除在谓... 查看详情

针对多个表优化缓慢的 postgresql 查询

...tgreSQL查询开始变慢(约15秒),因此我们考虑迁移到图形数据库。早期测试显示速度明显更快,太棒了。问题出在这里——我们仍然需要在Postgres中存储数据的备份以满足非分析需求。Graph数据 查看详情