我正在使用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'})
...与硬编码变量相比,这会产生类似的十到十二秒的延迟。任何cx_Oracle建议?
答案 0 :(得分:1)
Alrighty。进一步调查,我发现问题是Python和Oracle之间的字符串参数编码不匹配。修复了一个简单的what.encode('iso-8859-1')。如果这对您不起作用,请使用PL / SQL dump()函数检查Oracle编码。如果Python编码不起作用,请先尝试解码。