私はデータベースパフォーマンスsqlalchemyの及び又は
q = session.query(hd_tbl).\
join(dt_tbl, hd_tbl.c['data_type'] == dt_tbl.c['ID']).\
filter(or_(and_(hd_tbl.c['object_id'] == get_id(row['object']),
hd_tbl.c['data_type'] == get_id(row['type']),
hd_tbl.c['data_provider'] == get_id(row['provider']),
hd_tbl.c['data_account'] == get_id(row['account']))
for index, row in data.iterrows())).\
with_entities(hd_tbl.c['ID'], hd_tbl.c['object_id'],
hd_tbl.c['data_type'], hd_tbl.c['data_provider'],
hd_tbl.c['data_account'], dt_tbl.c['value_type'])
hd_tbl
と
dt_tbl
がSQL DB内の2つのテーブルがあり
、及びdata
からいくつかのデータを取得するために、次のSQLAlchemyのコードを使用すると、典型的には約1K-9Kエントリを含むパンダのデータフレームであります。 hd_tbl
には、現在約90k行が含まれています。
実行時間は、data
の長さで指数関数的に増加するようです。
SELECT data_header.`ID`, data_header.object_id, data_header.data_type, data_header.data_provider, data_header.data_account, basedata_data_type.value_type
FROM data_header INNER JOIN basedata_data_type ON data_header.data_type = basedata_data_type.`ID`
WHERE data_header.object_id = %s AND data_header.data_type = %s AND data_header.data_provider = %s AND data_header.data_account = %s OR
data_header.object_id = %s AND data_header.data_type = %s AND data_header.data_provider = %s AND data_header.data_account = %s OR
...
data_header.object_id = %s AND data_header.data_type = %s AND data_header.data_provider = %s AND data_header.data_account = %s OR
テーブルと列が完全にインデックス化され、パフォーマンスが満足ではありません。次のように(SQLAlchemyの別)、対応するSQLステートメントが見えます。現在、hd_tbl
とdt_tbl
のすべてのデータをメモリに読み込んで、pandas merge機能とマージするのは簡単です。しかし、これは最適ではないようです。誰でも、どのようにsqlalchemy呼び出しを改善するためのアイデアを持っている?
EDIT: 私は次のようにSQLAlchemyのtuple_を使用してsignifcantlyパフォーマンスを向上させることができました:私はあなたが作成をお勧めしたい...
SELECT data_header.`ID`, data_header.object_id, data_header.data_type, data_header.data_provider, data_header.data_account, basedata_data_type.value_type
FROM data_header INNER JOIN basedata_data_type ON data_header.data_type = basedata_data_type.`ID`
WHERE (data_header.object_id, data_header.data_type, data_header.data_provider, data_header.data_account) IN ((%(param_1)s, %(param_2)s, %(param_3)s, %(param_4)s), (%(param_5)s, ...))
もちろん、それは遅くなるでしょう。テーブルの1つをループし、何千もの条件を持つ巨大なWHERE句を構築することによって 'JOIN'をやっています。データフレームから一時テーブルを作成し、適切な 'JOIN'を実行する必要があります。 – univerio