sql >> データベース >  >> RDS >> PostgreSQL

一時テーブルのpostgresqlスレッドセーフ

    一時テーブルは、同じセッションのすべての操作に表示されます。だからあなたはできません 同じセッションで同じ名前の一時テーブルを作成します 存在するものを削除する前に(あなたの場合はトランザクションをコミットします)。

    使用することをお勧めします:

    CREATE TEMP TABLE tmptbl IF NOT EXISTS ...
    

    CREATE TABLEの詳細 マニュアルで。

    一意の一時テーブル

    (同じセッション内の)「スレッド」ごとに一時テーブルをローカルにするには、一意のテーブル名を使用する必要があります 。 1つの方法は、バインドされていないSEQUENCEを使用することです。 動的SQL-plpgsqlなどの手続き型言語またはDOステートメント(関数を格納しなくても基本的に同じです。

    1つ実行:

    CREATE SEQUENCE myseq;
    

    使用:

    DO $$
    BEGIN
    EXECUTE 'CREATE TABLE tmp' || nextval('myseq')  ||'(id int)';
    END;
    $$
    

    最新のテーブル名を知るには:

    SELECT 'tmp' || currval('myseq');
    

    または、すべてをplpgsql関数に入れてテーブルを返すか、テーブル名を再利用します。

    ただし、プレーンSQLステートメントはハードコードされた識別子で動作するため、以降のすべてのSQLコマンドは動的に実行する必要があります。したがって、すべてをplpgsql関数に入れるのがおそらく最善です。

    同じ一時テーブルを使用するための一意のID

    別の可能な解決策は、同じ温度テーブルを使用することです。 同じセッション内のすべてのスレッドに対して、列 thread_idを追加します テーブルに。この機能を多用する場合は、必ず列にインデックスを付けてください。次に、一意のthread_idを使用します スレッドごと(同じセッション内)。

    1回のみ:

    CREATE SEQUENCE myseq;
    

    スレッドごとに1回:

    CREATE TEMP TABLE tmptbl(thread_id int, col1 int) IF NOT EXISTS;
    my_id :=  nextval('myseq'); -- in plpgsql
    -- else find another way to assign unique id per thread
    

    SQL:

    INSERT INTO tmptbl(thread_id, col1) VALUES
    (my_id, 2), (my_id, 3), (my_id, 4);
    
    SELECT * FROM tmptbl WHERE thread_id = my_id;
    



    1. データベースのパフォーマンスを400%向上させる

    2. アプリケーションでのWhere式の重複を排除

    3. IRIWorkbenchでのデータレプリケーション

    4. SQLite JSON_EXTRACT()