Nie, obliczenie nie zostanie wykonane dwukrotnie, jeśli zostanie napisane dokładnie w ten sam sposób. Jeśli jednak Twoim celem jest poprawa wydajności Twojej aplikacji, możesz chcieć spojrzeć na szerszy obraz, zamiast koncentrować się na tym drobnym szczególe, który może dać co najwyżej dwukrotną różnicę. Poważniejszym problemem jest to, że Twoje zapytanie uniemożliwia efektywne wykorzystanie indeksów i spowoduje pełne skanowanie.
Sugerowałbym zmianę bazy danych tak, aby używać typu geometrii i utworzyć indeks przestrzenny na Twoich danych. Następnie możesz użyć MBRBWithin aby szybko znaleźć punkty, które leżą wewnątrz obwiedni twojego okręgu. Po znalezieniu tych punktów możesz przeprowadzić droższy test odległości tylko na tych punktach. Takie podejście będzie znacznie szybsze, jeśli Twoja tabela jest duża, a typowe wyszukiwanie zwraca tylko niewielką część wierszy.
Jeśli nie możesz zmienić modelu danych, nadal możesz poprawić wydajność, używając najpierw pola ograniczającego, na przykład WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60
. Zaznaczenie pola ograniczającego będzie w stanie użyćindeksu ale ponieważ indeksy R-Tree sąobsługiwane tylko dla typu geometrii będziesz musiał użyćstandardowego indeksu B-Tree który nie jest tak wydajny dla tego typu zapytań (ale nadal dużo lepsze niż to, co obecnie robisz).