मुझे कम से कम एक अनुकूलन पता है जो चलने के समय को आधा कर सकता है:
AND a.id < b.id
यह आपको a=1, b=2 का परीक्षण करने से रोकता है जब आप पहले ही a=2, b=1 का परीक्षण कर चुके होते हैं।
हालांकि यह अभी भी O(n^2) होने वाला है, लेकिन मैं यह नहीं देख सकता कि आप इसके बारे में कितना कुछ कर सकते हैं।