1

2 つの大きなテーブルがあり、それらを組み合わせる必要があります。マッチングは明確な比較であってはなりません。レーベンシュタインの公式であるトライグラムを使用しましたが、パフォーマンスが非常に低くなります。たぶん、誰かがパフォーマンスを改善するのを助けることができます。テーブル A のサイズは約 20 万行、テーブル B のサイズは約 60 万行です。

   CREATE TABLE TBL_A(NAME VARCHR,SURNAME VARCHAR, BIRTH_DATE DATE, TABLE_B_ID INT4);
   CREATE TABLE TBL_B(ID INT4, NAME VARCHR, SURNAME VARCHAR, BIRTH_DATE DATE);
--variant 1
SET pg_trgm.similarity_threshold = 0.8; 
UPDATE TBL_A A SET TABLE_B_ID = B.ID
FROM TBL_B B
WHERE A.NAME % B.NAME
AND A.SURNAME % B.SURNAME
AND ABS(A.BIRTH_DATE ::DATE - B.BIRTH_DATE ::DATE)<=1 
--variant 2
UPDATE TBL_A A SET TABLE_B_ID = B.ID
FROM TBL_B B
WHERE A.NAME = B.NAME
AND A.SURNAME = B.SURNAME
AND ABS(A.BIRTH_DATE ::DATE - B.BIRTH_DATE ::DATE)<=1   
--variant 3
UPDATE TBL_A A SET TABLE_B_ID = B.ID
FROM TBL_B B
WHERE levenshtein_less_equal (A.NAME ,B.NAME,2)<=2
AND levenshtein_less_equal (A.SURNAME ,B.SURNAME,2)<=2 
AND ABS(A.BIRTH_DATE ::DATE - B.BIRTH_DATE ::DATE)<=1 

これらのオプションはすべて、パフォーマンスが非常に悪かった (約 7 時間近く)。インデックスを作成してみましたが、あまり高速化されませんでした

CREATE INDEX ind_a_name ON TBL_A USING gist(NAME  trm_gist_ops);
CREATE INDEX ind_a_Surname ON TBL_A USING gist(SURNAME  trm_gist_ops);
4

1 に答える 1