#sql #postgresql
#sql #postgresql
Вопрос:
Я создал много пользовательских функций и операторов в postgresql, и я хочу создать класс operator для них всех, и я хочу использовать для них индексацию gin. Я не думаю, что я хорошо понял документацию postgres, потому что я не могу заставить ее работать. У кого-нибудь есть идея, как это сделать? В частности, как добавить индексацию gin. Я попытался просто создать класс operator и добавить его с ПОМОЩЬЮ gin, но когда я запускаю его через analize, он говорит, что он не использует поиск по индексу.
С уважением
РЕДАКТИРОВАТЬ: я создал операторы, которые будут выполнять глубокий поиск в формате jsonb по предоставленной вами паре ключ-значение. Они будут обрабатывать все значения как даты, чтобы вы могли выполнять поиск в виде <, >, =, != . Для этих операторов я создал класс operator
CREATE OPERATOR CLASS operatorClassName FOR TYPE jsonb
USING GIN as
OPERATOR 1 operatorSymbol (jsonb,jsonb),
OPERATOR 2 operatorSymbol (jsonb,jsonb),
OPERATOR 3 operatorSymbol (jsonb,jsonb),
OPERATOR 4 operatorSymbol (jsonb,jsonb)
И когда я запустил explain, он говорит, что вместо индекса используется последовательное сканирование. Что я сделал не так?
ПРАВКА2:
CREATE OPERATOR CLASS custom_jsonb_dates_operators FOR TYPE jsonb
USING gin AS
OPERATOR 1 #>? (jsonb, jsonb),
OPERATOR 2 #<? (jsonb, jsonb),
OPERATOR 3 #=? (jsonb, jsonb),
OPERATOR 4 #!=? (jsonb, jsonb);
CREATE OR REPLACE FUNCTION generic_jsonb_search(
entityObject jsonb,
filterObject jsonb
)
RETURNS boolean
LANGUAGE 'plpgsql'
AS $
DECLARE rec record;
BEGIN
FOR rec in
SELECT key, value
FROM jsonb_each_text(filterObject) as each(key, value)
LOOP
IF (
(WITH RECURSIVE jsonb_key_value_merge(key, value) AS (
SELECT t.key, t.value
FROM jsonb_each(entityObject) as t
UNION ALL
SELECT t.key, t.value
FROM jsonb_key_value_merge, jsonb_each(CASE
WHEN jsonb_typeof(jsonb_key_value_merge.value) <> 'object' THEN '{}' :: JSONB
ELSE jsonb_key_value_merge.value
END) as t
)
SELECT COUNT(*)
FROM jsonb_key_value_merge t
where jsonb_typeof(t.value) <> 'object'
AND t.value::date > (rec.value)::date AND rec.key = t.key) = 0
)
THEN
RETURN FALSE;
END IF;
END LOOP;
RETURN TRUE;
END
$
Комментарии:
1. Вы должны точно описать, что вы сделали и каковы ваши намерения. Мы можем помочь найти и решить проблему, но мы не можем предоставить руководство по расширению индексации PostgreSQL.
2. Вы правы. Я отредактировал сообщение, надеюсь, это немного прояснит ситуацию
3. А вы
SET enable_seqscan = off;
?4. Да, и он по-прежнему использует последовательное сканирование
5. Спасибо. Но я не вижу запроса, включающего один из новых операторов в коде функции, поэтому мне все равно нужно увидеть запрос, в котором он завершается с ошибкой. Кроме того,
CREATE INDEX
было бы полезно знать. Я не понимаю, почему вы опубликовали это определение функции.