2

このストアド プロシージャを実行する 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に影響を与える可能性がありますか?

いくつかの観察 -

  1. インポート プロセスの実行中に CLUSTER コマンドを実行 - サイズが下がらない
  2. インポート プロセスを停止してから CLUSTER を実行すると、サイズが小さくなります
  3. インポート プロセスを停止してインポート プロセスを開始し、その後 CLUSTER コマンドを実行すると、サイズが減少します

問題について何か考えはありますか?

4

2 に答える 2

3

マニュアルから:

テーブルがクラスター化されている場合、そのテーブルに対して ACCESS EXCLUSIVE ロックが取得されます。これにより、CLUSTER が終了するまで、他のデータベース操作 (読み取りと書き込みの両方) がテーブルに対して実行されなくなります。

毎時間 CLUSTER する必要がありますか? fillfactor と autovacuum が改善されれば、テーブルはそれほど大きくならず、テーブルに無駄なタプルはありません。

于 2011-01-13T18:40:52.587 に答える
1

OK - 犯人を見つけました。

問題は、django 環境で pstcopg2 を直接使用すると、奇妙な相互作用が発生したため、クラスターまたはバキュームがデッドタプルを削除しなかったことです。psycopg コードを分離し、django 関連のコードをインポート プロセスから削除した後、すべてが正常に機能しました。これで問題は解決し、インポートプロセスを停止せずにバキュームまたはクラスター化できるようになりました。

于 2011-01-14T23:00:58.903 に答える