Я пытаюсь создать функцию в Postgres, чтобы мои запросы выполнялись быстрее по сравнению с Django ORM. Но проблема, с которой я сталкиваюсь, заключается в том, что результаты приходят, когда в запросе нет условия WHERE
.
Это функция и ее вызов, который возвращает 0 строк:
CREATE OR REPLACE FUNCTION public.standard_search(search_term text, similarity_to integer)
RETURNS TABLE(obj_id integer, app_num integer, app_for text, similarity integer)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
similarity integer;
BEGIN
RETURN QUERY
SELECT mark.id, mark.app_num, mark.app_for::text, levenshtein($1, focusword.word) AS similarity
FROM mark
INNER JOIN focusword ON (mark.id = focusword.mark_id)
WHERE similarity <= $2
ORDER BY similarity, mark.app_for, mark.app_num;
END
$BODY$;
select * from public.standard_search('millennium', 4)
Это это функция и ее вызов, который дает мне результаты, но медленный, так как фильтрация выполняется в вызове функции:
CREATE OR REPLACE FUNCTION public.standard_search(search_term text, similarity_to integer)
RETURNS TABLE(obj_id integer, app_num integer, app_for text, similarity integer)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
similarity integer;
BEGIN
RETURN QUERY
SELECT mark.id, mark.app_num, mark.app_for::text, levenshtein($1, focusword.word) AS similarity
FROM mark
INNER JOIN focusword ON (mark.id = focusword.trademark_id)
ORDER BY similarity, trad.app_for, mark.app_num;
END
$BODY$;
select * from public.standard_search('millennium', 4) where similarity <= 4
Может ли кто-нибудь пролить свет на то, что здесь на самом деле идет не так? После этого я могу работать над улучшением производительности.
Мне не удалось выполнить это через VIEWS, так как требовался хотя бы один параметр, т. Е. search_term
для передачи в функцию levenshtein()
.
Я также столкнулся с проблемой передачи tuple
в качестве параметра в функцию, которая снова будет использоваться в предложении where, например: WHERE mark.class in (1,2,3,4,5)
Я делал это ранее через Raw SQL особенность Django ORM, но пытаюсь сделать это здесь из-за увеличения производительности.