Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как избавиться от многократного вычисления функции в запросе? / 17 сообщений из 17, страница 1 из 1
07.07.2008, 11:36
    #35414455
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
Нужно вычислить функцию от поля и возвратить часть получившихся строк в зависимости от значения функции

Код: plaintext
1.
2.
select id, func(x) as y
from tbl
where func(x)> 0 . 85 

Как-то так.

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

Как сократить количество вычислений функции до одного?
...
Рейтинг: 0 / 0
07.07.2008, 11:45
    #35414481
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoe
Как сократить количество вычислений функции до одного?

можно, конечно, два запроса сделать - select, потом delete where... Но тогда места много скушает промежуточная таблица.
...
Рейтинг: 0 / 0
07.07.2008, 12:57
    #35414705
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoe crusoe
Как сократить количество вычислений функции до одного?

можно, конечно, два запроса сделать - select, потом delete where... Но тогда места много скушает промежуточная таблица.

Во-первых, можно выполнить фильтрацию подзапроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
from (
	select random() AS Rnd
	from generate_series( 1 ,  10 )
    ) CurMain
WHERE Rnd >  0 . 5 
Во-вторых, взгляните на IMMUTABLE и STABLE для функций.
...
Рейтинг: 0 / 0
07.07.2008, 13:14
    #35414761
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
Kruchinin Pahan crusoe
можно, конечно, два запроса сделать - select, потом delete where... Но тогда места много скушает промежуточная таблица.

Во-первых, можно выполнить фильтрацию подзапроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
from (
	select random() AS Rnd
	from generate_series( 1 ,  10 )
    ) CurMain
WHERE Rnd >  0 . 5 
Во-вторых, взгляните на IMMUTABLE и STABLE для функций.

Фильтрация - та же самая временная таблица будет. Ну может чуть быстрее всё пройдёт. А вот IMMUTABLE и STABLE в CREATE FUNCTION - как раз то, что нужно!

Большое спасибо!
...
Рейтинг: 0 / 0
07.07.2008, 13:57
    #35414916
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoeФильтрация - та же самая временная таблица будет.зачем временная таблица для фильтрации ? это же не order by...
...
Рейтинг: 0 / 0
07.07.2008, 14:13
    #35415001
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
Ёш crusoeФильтрация - та же самая временная таблица будет.зачем временная таблица для фильтрации ? это же не order by...

Теоретически, конечно, временную таблицу всю сразу вычислять не нужно. Так что Вы правы наверняка. Меня смутил отрывок из справочника SELECT (FROM clause):

sub-SELECT can appear in the FROM clause. This acts as though its output were created as a temporary table for the duration of this single SELECT command. Note that the sub-SELECT must be surrounded by parentheses, and an alias must be provided for it.

Написано "так как будто создаётся временная таблица".

Спасибо за коммент!
...
Рейтинг: 0 / 0
08.07.2008, 00:46
    #35416391
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
Вариант 1(фантастический) Проанализируйте сначала саму функцию. Может быть можно сократить количество вычислений на основании x и некоторых допущений.

Вариант 2(реалистический) - Добавить в таблицу поле FUNX и сохранять туда значение fun(x) в момент вставки записи или изменения значения x. Тогда выборка станет тривиальной и очень быстрой.
...
Рейтинг: 0 / 0
08.07.2008, 10:25
    #35416797
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoeIMMUTABLE и STABLE в CREATE FUNCTION - как раз то, что нужно!+1
...
Рейтинг: 0 / 0
08.07.2008, 15:28
    #35417938
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
LeXa NalBat crusoeIMMUTABLE и STABLE в CREATE FUNCTION - как раз то, что нужно!+1

Однако... Пытаюсь тестировать функцию при помощи запроса:

Код: plaintext
1.
2.
3.
4.
5.
select jwcmps(title,title) as pjw_t
into temporary res
from titles
where jwcmps(title,title)> 0 . 85 
limit  10000 

независимо от того, как я определил эту функцию, IMMUTABLE или VOLATILE имею примерно одинаковое время (что-то около 310мс)! Похоже, что время вычисления всех необходимых значений функции, даже будучи удвоенным, много меньше времени вставки 10000 записей во временную таблицу.

Интересно, как бы это протестировать получше?
...
Рейтинг: 0 / 0
08.07.2008, 15:41
    #35417979
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
сравните время выполнения запросов

Код: plaintext
1.
2.
3.
4.
select jwcmps(title,title) as pjw_t
into temporary res
from titles
where jwcmps(title,title)> 0 . 85 
limit  10000 

и

Код: plaintext
1.
2.
3.
select jwcmps(title,title) as pjw_t
from titles
where jwcmps(title,title)> 0 . 85 
limit  10000 
...
Рейтинг: 0 / 0
08.07.2008, 16:29
    #35418166
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoeКак сократить количество вычислений функции до одного?
Т.е. до нуля Вам не нужно, нужно до одного? Зачем вообще все эти извращения?
...
Рейтинг: 0 / 0
08.07.2008, 16:51
    #35418268
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
LeXa NalBatсравните время выполнения запросов

Значит, постгрескуль воспринимает мою функцию как VOLATILE независимо от того что я пишу в CREATE FUNCTION?
...
Рейтинг: 0 / 0
08.07.2008, 16:53
    #35418284
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
MySQLCraft
Т.е. до нуля Вам не нужно, нужно до одного? Зачем вообще все эти извращения?

Чтобы два раза одно и тоже значение не вычислять. Если Вам всё равно, сколько требуется времени для ответа на запрос - 3 часа или 6 - то тогда конечно, не стоит заморачиваться с такими нюансами.
...
Рейтинг: 0 / 0
08.07.2008, 17:42
    #35418414
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoeЧтобы два раза одно и тоже значение не вычислять.

Ну и с теоретической точки зрения интересно. Нужно же знать как сервер работает?! Не скажешь ведь заказчикам: я, мол, своё дело сделал, а тормозит, потому что сервер такой!

%-)
...
Рейтинг: 0 / 0
08.07.2008, 17:54
    #35418463
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
crusoe MySQLCraft
Т.е. до нуля Вам не нужно, нужно до одного? Зачем вообще все эти извращения?

Чтобы два раза одно и тоже значение не вычислять. Если Вам всё равно, сколько требуется времени для ответа на запрос - 3 часа или 6 - то тогда конечно, не стоит заморачиваться с такими нюансами.
Ну и вычисляйте один раз во время INSERT/UPDATE. В чем проблема?
...
Рейтинг: 0 / 0
08.07.2008, 18:04
    #35418507
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
MySQLCraft
Ну и вычисляйте один раз во время INSERT/UPDATE. В чем проблема?

1. Теоретический интерес.
2. База будет заполняться путём импорта из файла. От 10000 строк/файл.
...
Рейтинг: 0 / 0
08.07.2008, 18:13
    #35418544
crusoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавиться от многократного вычисления функции в запросе?
Давайте свернём дискуссию. Внятный ответ про IMMUTABLE найден здесь: http://www.postgresqlforums.com/forums/viewtopic.php?f=11&t=512&p=1916&hilit=volatility#p1916

Суть - IMMUTABLE говорит о том, что функция абсолютно детерминирована своими параметрами, но если она вызывается дважды в запросе, то и вычисляется дважды.

Большое спасибо всем, кто ответил мне!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как избавиться от многократного вычисления функции в запросе? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]