【发布时间】:2018-09-19 09:51:11
【问题描述】:
我实际上使用 Python 中的 Cx_Oracle 库来处理我的数据库 Oracle。
import cx_Oracle as Cx
# Parameters for server connexion
dsn_tns = Cx.makedsn(_ip, _port, service_name=_service_name)
# Connexion with Oracle Database
db = Cx.connect(_user, _password, dsn_tns)
# Obtain a cursor for make SQL query
cursor = db.cursor()
在某些条件下,我的一个查询将 Python 数据帧的 INSERT 写入我的 Oracle 目标表。
query = INSERT INTO ORA_TABLE(ID1, ID2)
SELECT :1, :2
FROM DUAL
WHERE (:1 != 'NF' AND :1 NOT IN (SELECT ID1 FROM ORA_TABLE))
OR (:1 = 'NF' AND :2 NOT IN (SELECT ID2 FROM ORA_TABLE))
此查询的目标是仅将符合条件的行写入 WHERE。
实际上,当我的 Oracle 目标表行数很少时,此查询效果很好。但是,如果我的目标 Oracle 表有超过 100 000 行,它会非常慢,因为我在 WHERE 条件下读取了所有表。
有没有办法通过 join 或其他方法来提高此查询的性能?
代码结束:
# SQL query incoming
cursor.prepare(query)
# Launch query with Python dataset
cursor.executemany(None, _py_table.values.tolist())
# Commit changes into Oracle database
db.commit()
# Close the cursor
cursor.close()
# Close the server connexion
db.close()
【问题讨论】:
-
id1和id2在ora_table中是否定义为not null? -
是的,表中没有缺失值。我改用“NF”。
-
但是实际的列定义是否包括
NOT NULL?这与是否填充所有值不同。 -
我不清楚对不起。是的,在Oracle目标表定义中,ID1和ID2不是NULLABLE
-
什么是 Python 数据集?你是说熊猫数据框吗?
标签: python sql oracle cx-oracle