Нам нужна функция для извлечения набора свойств, основанных либо на имени окрестности, либо на геометрическом фильтре PostGIS.
Сопоставление окрестностей выполняется намного быстрее, поэтому, когда это возможно, мы используем его с геофильтром какотступление.
Исходная функция, которая соответствовала только соседству, была очень быстрой:
func_a:
CREATE OR REPLACE FUNCTION func_a( _neighborhood text )
RETURNS TABLE(f1 int) AS $$
SELECT id FROM parcels
WHERE neighborhood = _neighborhood
ORDER BY id
LIMIT 10 $$
LANGUAGE SQL;
Затем я добавил альтернативный параметр гео(передается как геотекст WKT) и следовал методу, продемонстрированному здесь и здесь для эффективного игнорирования любого параметра, равного NULL:
func_b:
CREATE OR REPLACE FUNCTION func_b( _neighborhood text = NULL
, _geo text = NULL)
RETURNS TABLE(f1 int) AS $$
SELECT id FROM parcels
WHERE (_neighborhood IS NULL OR neighborhood = _neighborhood)
AND (_geo IS NULL OR ST_Intersects(geometry, ST_GeomFromText(_geo, 3857)))
ORDER BY id
LIMIT 10 $$
LANGUAGE SQL;
И хотя func_b работал, он был намного медленнее, чем func_a, даже когда был пропущен только параметр _neighborhood.На самом деле func_b оказался таким же медленным, независимо от того, был ли передан параметр _neighborhood или _geo, что для меня не имеет смысла.Если func_b вызывается с использованием действительного параметра _neighborhood и параметра NULL _geo, разве он не должен работать так же, как func_a?