Не, изчислението няма да се извърши два пъти, ако е написано по абсолютно същия начин. Ако обаче целта ви е да подобрите производителността на приложението си, тогава може да искате да погледнете по-голямата картина, вместо да се концентрирате върху този незначителен детайл, който може да ви даде най-много два фактора. По-сериозен проблем е, че вашата заявка предотвратява ефективното използване на индекси и ще доведе до пълно сканиране.
Бих препоръчал да промените вашата база данни, така че да използвате типа геометрия и да създадете пространствен индекс на вашите данни. След това можете да използвате MBRWithin за бързо намиране на точките, които се намират вътре в ограничителната кутия на вашия кръг. След като намерите тези точки, можете да проведете своя по-скъп тест за разстояние само върху тези точки. Този подход ще бъде значително по-бърз, ако таблицата ви е голяма и типичното търсене връща само малка част от редовете.
Ако не можете да промените модела на данните, тогава все пак можете да подобрите производителността, като първо използвате отметка в ограничително поле, например WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60
. Отметката на ограничаващото поле ще може да използва индекс, но тъй като индексите R-Tree се поддържат само за типа геометрия, ще трябва да използвате стандартния индекс B-Tree, който не е толкова ефективен за този тип заявка (но все пак много по-добре от това, което правите в момента).