このストアド プロシージャを実行する Python プロセスを実行しています。このストアド プロシージャは、特定のディレクトリから postgres データベースにファイルをインポートします。これらのファイルは、まずインメモリ テーブルにインポートされ、次にディスク テーブルにインポートされます。インメモリ テーブルの実際のサイズは、実際には 30 MB を超えることはありません。このテーブルは常に更新されるため、テーブルのサイズが大きくなります (デッドタプルのため)。物事を抑えるために、テーブルで CLUSTER 操作を実行する必要があります。psycopg2 モジュールを使用してストアド プロシージャとテーブルの CLUSTER を実行していますが、インポート プロセスが実行されている場合、テーブルのサイズは決して小さくなりません。しかし、インポート プロセスを停止して CLUSTER を実行すると、テーブルのサイズが小さくなります。パフォーマンス上の理由から、インポート手順を停止せずに CLUSTER コマンドを実行できるはずです。
手動コミット ISOLATION_LEVEL_AUTOCOMMIT を試しましたが、どれもうまくいきませんでした。以下はプロセスのサンプルコードです -
while True:
-get the filenames in directory
for filpath in filenames:
conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
cursor = conn.cursor()
# Calls a postgresql function that reads a file and imports it into
# a table via INSERT statements and DELETEs any records that have the
# same unique key as any of the records in the file.
cursor.execute("SELECT import('%s', '%s');" % (filepath, str(db_timestamp))
conn.commit()
cursor.close()
conn.close()
os.remove(get_media_path(fname))
同様の conn オブジェクトを使用して、1 時間に 1 回 CLUSTER コマンドを実行したい -
conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
cursor = conn.cursor()
cursor.execute("CLUSTER table_name")
conn.commit()
cursor.close()
conn.close()
また、設定してみました -
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
もう1つの情報-私はこれらすべてをdjango環境内で実行しています。django接続オブジェクトを使用してタスクを実行できませんでした.djangoは私のスレッドコードとの接続を解放できず、すぐにデータベースは接続の受け入れを停止しました.この混合環境はpsycopgに影響を与える可能性がありますか?
いくつかの観察 -
- インポート プロセスの実行中に CLUSTER コマンドを実行 - サイズが下がらない
- インポート プロセスを停止してから CLUSTER を実行すると、サイズが小さくなります
- インポート プロセスを停止してインポート プロセスを開始し、その後 CLUSTER コマンドを実行すると、サイズが減少します
問題について何か考えはありますか?