【发布时间】: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