更新
如果在Unicode中指定了schema
,则会出现此问题。这仅用于_get_constraint_data
中的查询。具体来说,使用all_cons_columns
进行连接是导致速度下降的原因。其他两个表工作正常。转换为纯string
可解决此问题。
此sqlalchemy doc建议将对象从string
转换为unicode
,然后再写入数据库,但这可能不适用于_get_constraint_data
方法或带有表名的对象
我最近升级到Oracle 12c,并注意到,如果我使用Table
构造一个autoload=True
对象,则大约需要35分钟。
逐步执行SqlAlchemy代码,似乎挂起的方法是oracle\base.py中fetchall()
的{{1}}部分。
我发现奇怪的是,以下内容需要大约35分钟才能运行:
_get_constraint_data
但是,如果我自己构造查询而不替换任何参数,则大约需要3秒钟才能运行:
rp = connection.execute(sql.text(text), **params)
constraint_data = rp.fetchall()
这是最终查询的外观:
rp = connection.execute(sql.text(text))
constraint_data = rp.fetchall()
不确定是什么原因导致此问题。在这两种情况下,似乎在SELECT
ac.constraint_name,
ac.constraint_type,
loc.column_name AS local_column,
rem.table_name AS remote_table,
rem.column_name AS remote_column,
rem.owner AS remote_owner,
loc.position as loc_pos,
rem.position as rem_pos,
ac.search_condition,
ac.delete_rule
FROM all_constraints ac,
all_cons_columns loc,
all_cons_columns rem
WHERE ac.table_name = u'MY_TABLE'
AND ac.constraint_type IN ('R','P', 'U', 'C')
AND ac.owner = u'MY_SCHEMA'
AND ac.owner = loc.owner
AND ac.constraint_name = loc.constraint_name
AND ac.r_owner = rem.owner(+)
AND ac.r_constraint_name = rem.constraint_name(+)
AND (rem.position IS NULL or loc.position=rem.position)
ORDER BY ac.constraint_name, loc.position
内部都调用了相同的cursor.fetchall()
。