1

my_obj2つのフィールドを持つテーブルがvalue_a varchar(5)あり、value_b varchar(5)

実際、2 つの値はそれほど変わらず、ペアにグループ化できます。せいぜい、最大数が 100 ペア未満になります。それどころか、私は数百万のレコードを持っていmy_objます。

すべてのクエリが干渉しvalue_avalue_b非常に長い時間がかかります。value_aそこで、フィールドとを使用して、考えられるすべてのペアのテーブル ペアを作成することにしましたvalue_b。その結果、テーブルにフィールド id_pair を追加しましたmy_obj

テーブル ペアをすべてのペアで埋めました。問題ありません。my_objそこで、次のコマンドを使用して、それに応じてテーブルを更新したいと思いました。

update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b;

クエリが長時間起動されている間に、実行したselect count(*) from my_obj where id_pair > 0;ところ、返されました0

そのため、更新クエリに問題がありました。 EDIT / NB:トランザクションユニットであるplpgsql関数は、トランザクションの最後にコミットを実行するため、関数を中断してからテーブルに変更が見られないの は完全に正常でした。

の主キーの条件で更新クエリを変更して、1 つのレコードに対して 1my_objつだけ実行するようにしました。update

update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b
where o.id = 1234567;  -- 1234567 being the key of an existing record

驚くべきことに、レコードを 1 つだけにするこのクエリを起動すると、永遠updateにかかるようです。

私は何を間違っていますか?

4

1 に答える 1

3

これはどのように機能しますか?

update my_obj o
set    id_pair = p.id
from   pair p
where  p.value_a = o.value_a and
       p.value_b = o.value_b and
       o.id = 1234567; 
于 2013-03-27T23:37:58.527 に答える