удаление и возврат данных в PostgreSQL - PullRequest
0 голосов
/ 09 февраля 2010

У меня следующая проблема: моя таблица достаточно большая (миллионы строк данных), это временные данные, которые я обрабатываю. Мне нужно выбрать максимум и минимум одного столбца в соответствии с некоторыми критериями, обработать эту информацию и удалить данные в соответствии с теми же критериями. На самом деле, самая простая реализация выглядит так:

select max(col), min(col) from _TABLE_ where _CONDITION_;
...
delete from _TABLE_ where _CONDITION_;

таблица большая, и когда я ее обрабатываю, опрашивая таким образом в цикле, это занимает некоторое время. Я думал, что я могу оптимизировать его, используя «возвращение» при удалении, как

delete from _TABLE_ where _CONDITION_ returning max(col), min(col);

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

Есть ли хороший способ улучшить два запроса (выбрав максимум / мин данных и удалив одни и те же данные), сделав вместо этого один запрос? Любой трюк?

заранее благодарю за любую информацию, Maxym

Ответы [ 2 ]

7 голосов
/ 09 мая 2012

Вы можете сделать:

with foo as(delete from table where _CONDITION_ returning col)
select max(col), min(col) from foo
1 голос
/ 09 февраля 2010

Используйте функцию, подобную этой:

create temporary table test (value int);
insert into test select generate_series(1,100);

create or replace function delete_even_from_test_and_return_min_deleted()
  returns int as
$$
declare
  _value record;
  min int;
begin
  min=X'7FFFFFFF'; -- INT_MAX
  for _value in
    delete from test where value%2=0 returning value
  loop
    if min>_value.value then
      min=_value.value;
    end if;
  end loop;
  return min;
end;
$$ language plpgsql;

select count(*) from test;
100

select delete_even_from_test_and_return_min_deleted();
2

select count(*) from test;
50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...