python - 为什么使用文字进行 Pandas Oracle DB 查询更快?
问题描述
当我使用此处找到的绑定变量方法时:https ://cx-oracle.readthedocs.io/en/latest/user_guide/bind.html#bind 和此处:Python cx_Oracle 绑定变量 我的查询大约需要 8 分钟,但是当我使用硬编码值(文字),大约需要 20 秒。
我正在努力理解“幕后”发生的事情(变量/内存访问/数据传输/查询解析),看看是否有任何方法可以让我坚持使用绑定变量的推荐方法并获得相同的结果~ 20多岁的表现。
这个 python 脚本将是自动化的,并且值将是动态的,所以我绝对不能使用硬编码的值。
技术背景:Python 3.6;甲骨文 11g;cx_Oracle 8
---- python部分代码-----
第一个版本
param_dict = {“startDate:”01-Jul-21”, “endDate:”31-Jul-2021”}
conn = (typical database connection code….)
cur = conn.cursor()
###### this query has the bind variables and param_dict keys match bind variable aliases; runtime ~480s (8mins)
cur_df = pandas.DataFrame(cur.execute("inserted_query_here", param_dict))
第二版
conn = (typical database connection code….)
cur = conn.cursor()
###### this query has the hardcoded values (literals); runtime ~20s
cur_df = pandas.DataFrame(cur.execute("inserted_query_here"))
解决方案
@ChristopherJones 和 Alex 感谢您引用的文章。通过彻底检查解释计划,我已经能够解决这个问题。执行得更快的查询没有使用索引(更快地进行全表扫描);另一个是(绑定查询的变量版本)。
我相应地应用了 NO_INDEX 提示,现在对于查询的绑定变量版本有大约 20 秒的结果。
推荐阅读
- php - 如何在php中转换数组字符串
- java - 无法从 AWS Lambda 连接到 AWS RDS MySql DB。ClassNotFoundException:com.mysql.jdbc
- python - Python:迭代 API 字节字符串
- c# - 为什么我在这里得到“无法将 null 转换为 'ScheduleType',因为它是不可为空的值类型”?
- docker - 使用 gcsfuse-mounted Bucket 中的数据在 Google Cloud 实例上运行 Docker
- r - 构建“R Packages”一书时Windows系统调用失败
- python - 如何从可训练的张量流变量转换为不可训练的张量流变量?
- java - Java junit 断言已引发异常
- stm32 - 关于 FreeRTOS 如何在 STM32 平台上排队任务的一些困惑
- ios - 为什么 armv7s / arm64e 架构不增加封装大小?