Conheço pelo menos uma otimização que pode reduzir o tempo de execução pela metade:
AND a.id < b.id
Isso evita que você teste a=1, b=2 quando já testou a=2, b=1.
Ainda vai ser O(n^2), mas não vejo como você pode fazer muito sobre isso.
AND a.id < b.id