Tôi biết ít nhất một tối ưu hóa có thể giảm một nửa thời gian chạy:
AND a.id < b.id
Điều này ngăn bạn kiểm tra a =1, b =2 khi bạn đã kiểm tra a =2, b =1.
Tuy nhiên, nó vẫn sẽ là O (n ^ 2), nhưng tôi không thể biết bạn có thể làm gì nhiều về điều đó.