2013-03-11 44 views
8

Tôi có hai bảng tương tự trong Postgres chỉ với một trường latin 32 byte (md5 băm đơn giản). Cả hai bảng đều có ~ 30.000.000 hàng. Bàn có sự khác biệt nhỏ (10-1000 hàng khác nhau)Tìm sự khác nhau giữa hai bảng lớn trong PostgreSQL

Có thể với Postgres để tìm sự khác biệt giữa các bảng này, kết quả phải là 10-1000 hàng tôi đã mô tả ở trên.

Đây không phải là một nhiệm vụ thực sự, tôi chỉ muốn biết về cách PostgreSQL xử lý với logic giống như JOIN.

+0

xem xét điều này [Cách so sánh hai bảng trong postgres] (http://stackoverflow.com/questions/4814597/how-to-compare-two-tables-in-postgres) và điều này để tăng tốc độ khác biệt [ Làm thế nào tôi có thể tăng tốc độ khác biệt giữa các bảng?] (Http://stackoverflow.com/questions/6337871/how-can-i-speed-up-a-diff-between-tables) – static

+0

Vì vậy, bạn có câu trả lời của bạn? –

+0

Có: Hadoop .... – odiszapc

Trả lời

18

Các lựa chọn tốt nhất có lẽ là một EXISTS chống bán tham gia:

tbl1 là bảng với hàng thặng dư trong ví dụ này:

SELECT * 
FROM tbl1 
WHERE NOT EXISTS (SELECT 1 FROM tbl2 WHERE tbl2.col = tbl1.col); 

Nếu bạn không biết mà bảng có hàng thặng dư hoặc cả hai đều có, bạn có thể lặp lại truy vấn trên sau khi chuyển đổi tên bảng hoặc:

SELECT * 
FROM tbl1 
FULL OUTER JOIN tbl2 USING (col) 
WHERE tbl2 col IS NULL OR 
     tbl1.col IS NULL; 

Tổng quan về các kỹ thuật cơ bản trong một bài sau:

BTW, nó sẽ là nhiều hiệu quả hơn để sử dụng uuid cột cho băm md5:

-1

Theo kinh nghiệm của tôi, KHÔNG IN với truy vấn con mất một thời gian rất dài. Tôi muốn làm điều đó với sự tham gia hòa nhập:

DELETE FROM table1 where ID IN (
SELECT id FROM table1 
LEFT OUTER JOIN table2 on table1.hashfield = table2.hashfield 
WHERE table2.hashfield IS NULL) 

Và sau đó thực hiện tương tự theo cách khác cho bàn kia.

+0

Lưu ý rằng 'NOT IN' khác với hiệu trưởng từ' NOT EXISTS'. Xử lý 'NULL' là khác nhau, điều này khiến cho' NOT IN' đắt hơn. –