2012-05-24 2 views
0

Я хотел бы разрешить выполнение функции PL/PGSQL (my_function) только в том случае, если его аргумент (my_table.x) относится к предопределенному интервалу (например, [100,1000]) ,Избегайте выполнения некоторых функций PL/PGSQL путем перезаписи запроса

Давайте рассмотрим следующий пример запроса:

(д) SELECT * FROM my_table WHERE my_function(mytable.x);

Я хотел бы этот запрос автоматически переписывает себя, чтобы проверить, принадлежит ли mytable.x к интервалу [100,1000]:

(q ') SELECT * FROM my_table WHERE (my_table.x BETWEEN 100 AND 1000) AND my_function(my_table.x);

Команда EXPLAIN ANALYSE показывает, что второй запрос действительно быстрее первого.

Как изменить план выполнения запроса, чтобы автоматизировать процесс перезаписи запросов (q в q ')? Где можно хранить метаданные относительно интервала [100,1000], связанного с my_function?

Благодаря авансовым,

Томас Girault

помощь мне нужна будет помощь проект о интеграции нечеткой логики в PostgreSQL: [https://github.com/postgresqlf/PostgreSQL_f/] [ PostgreSQLf]

+0

Что делает моя_функция? – dezso

+0

Функция 'my_function' вызывает следующую функцию CREATE OR REPLACE FUNCTION низкий (VAL двойной точности) возвращает двойной точности AS $ ТЕЛА $ \t ВЫБОР trapezoidal_fuzzy_predicate ($ 1, 0,0,1000,100000); $ ТЕЛО $ ЯЗЫК sql IMMUTABLE –

ответ

1

Самый быстрый способ поймать это что-то вроде этого в верхней части тела функции:

IF $1 BETWEEN 100 AND 1000 THEN 
    -- proceed 
ELSE 
    RETURN NULL; -- Or what ever you want to return in this case 
END IF; 

Это должно быть очень быстро.


Фактический запрос переписывание делается с RULE system в PostgreSQL. Но правила применяются к таблицам и представлениям, а не к функциям. Вы можете обернуть свой запрос в представлении - но тогда вы можете добавить дополнительное условие явно, что дешевле.

CREATE VIEW v_tbl_only_valid_x AS 
    SELECT * 
    FROM tbl 
    WHERE x BETWEEN 100 AND 1000; 

Вызов:

SELECT * FROM v_tbl_only_valid_x WHERE my_function(x); 

Таким образом, планировщик запросов получает информацию о селективности запроса на колонке x в явном виде, что может привести к другой план запроса.

Но было бы проще просто добавить второе условие WHERE в ваш запрос, как будто у вас его есть в q'?

+0

'my_function' вызывает функцию трапециевидного членства [link] (http://www.dma.fi.upm.es/java/fuzzy/fuzzyinf/funpert_en.htm), которая сначала тестирует, если ее аргумент принадлежит интервалу [ 100, 1000].К сожалению, он не оптимизирован для проверки членства на интервал внутри 'my_function'. Однако с оптимизацией «BETWEEN» тест членства выполняется вне 'my_function'. –

+0

Благодарим вас за помощь, но я уже попытался интегрировать тест членства в верхней части тела функции. К сожалению, он не оптимизирован. –

+0

@ThomasGirault - Что значит «оптимизировано»? Таким образом, ваша функция будет почти ничего не делать, если x выходит за пределы вашего интервала. – dezso

 Смежные вопросы

  • Нет связанных вопросов^_^