python - cx_Oracle 数据库清理过度减慢查询

标签 python database oracle web.py cx-oracle

我正在使用 web.py 从 Oracle 创建一个简单的报告页面。当我采用使用 vars= 传递参数的最佳实践方法时,延迟为 11-12 秒。当我使用字符串替换执行相同的查询时,查询会在不到一秒的时间内运行。这是我检查的方式:

sql = """
SELECT a, b, c
FROM   my_table
WHERE  what = $what
ORDER  BY a, b"""

print('before', datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

result = db.query(sql, vars={'what': '1234'})

print('after', datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

“之前”和“之后”显示得比我在查询上遇到的大量延迟要清楚。我已经尝试使用具有相同 vars= 的 select() 并且得到相同的延迟。所以,我最初的建议是 web.db 的 SQL 转义函数造成了延迟。我不想传递未转义的输入,而且似乎不应该有这么多开销。

还有什么可能造成这种延迟吗?如果是转义逻辑,是否有任何我需要注意的问题?

提前致谢!

编辑:

在进一步调查中,我已经证明(至少对我自己而言)延迟并非特定于 web.py,而是发生在 cx_Oracle 中。我得出了这个结论,修改了我的 sql 语法并做:
cursor = db._db_cursor()

lines = cursor.execute(sql.format(my_table, {'what': '1234'})

...与对变量进行硬编码相比,这会产生类似的 10 到 12 秒延迟。任何 cx_Oracle 建议?

最佳答案

好吧。在进一步的进一步调查中,我发现问题是 Python 和 Oracle 之间对于我传递的字符串参数的编码不匹配。用一个简单的 what.encode('iso-8859-1') 修复它。如果这对您不起作用,请使用 PL/SQL dump() 函数检查 Oracle 编码。如果 Python 编码不起作用,请先尝试解码。

关于python - cx_Oracle 数据库清理过度减慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434075/

相关文章:

mysql - 是否可以从数据库创建 ruby​​-on-rails 迁移?

sql - 函数和语句的区别

sql - Oracle To_Char函数如果已经是字符串怎么处理

python - 核心转储 : Extract all the global variables , 核心转储中的数据结构和子结构

python - 在 QWidget (pyqt5) 上的 QPixmap 上绘制点

数据库加密题

php - JSON 在我的应用程序中返回 [null,null]

python - 如何删除 Django 用户的电子邮件?

python - 我从哪里开始使用网络机器人?

sql - 在 Oracle 12c 中使用 JSON 的 Json 查询与 SQL 查询(性能)