【问题标题】:cx_Oracle database sanitizing slows query excessivelycx_Oracle 数据库清理过分降低查询速度
【发布时间】:2013-12-24 09:43:10
【问题描述】:

我正在使用 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 database oracle web.py cx-oracle


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-09
      • 2017-10-13
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2022-08-06
      相关资源
      最近更新 更多