Отличающееся предложение WHERE в зависимости от параметра функции Postgres - PullRequest
0 голосов
/ 01 января 2019

Нам нужна функция для извлечения набора свойств, основанных либо на имени окрестности, либо на геометрическом фильтре 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...