Re: Converting each item in array to a query result row

Поиск
Список
Период
Сортировка
От Adam Ruth
Тема Re: Converting each item in array to a query result row
Дата
Msg-id E8359AB3-3618-4457-80EE-781BD3D75616@mac.com
обсуждение исходный текст
Ответ на Re: Converting each item in array to a query result row  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: Converting each item in array to a query result row  (Postgres User <postgres.developer@gmail.com>)
Список pgsql-general
Good point, I should have specified 8.3.7.

Just one more reason to anxiously anticipate upgrading to 8.4.



On 30/05/2009, at 2:56 AM, Tom Lane wrote:

> Adam Ruth <adamruth@mac.com> writes:
>> Always test your performance assumptions. The plpgsql function is
>> faster than the sql function, a lot faster on smaller arrays.
>
> And, of course, it also pays to be precise about what you're testing
> and on what.  Set-returning SQL functions got a lot faster in 8.4.
> Using CVS HEAD on a not-very-fast machine, I get these timings for
> the attached script (10000 loop iterations in all cases)
>
>             10 elements    100 elements    1000 elements
>
> built-in unnest        2.44        6.52        47.96
> SQL function        2.52        6.50        46.71
> plpgsql function    3.63        12.47        101.68
>
> So at least in this specific test condition, there's not much
> perceptible difference between the SQL function and the builtin,
> while plpgsql lags behind.
>
>             regards, tom lane
>
>
> create or replace function testit(n int, l int) returns float8 as $$
> declare arr int[];
>  st timestamptz;
>  et timestamptz;
> begin
>  arr := '{}';
>  for i in 1 .. n loop
>    arr[i] = i;
>  end loop;
>  st := clock_timestamp();
>  for i in 1 .. l loop
>    perform count(*) from unnest(arr); -- or unnest_sql or
> unnest_plpgsql
>  end loop;
>  et := clock_timestamp();
>  return extract(epoch from et - st);
> end $$ language plpgsql;
>
> CREATE or replace FUNCTION unnest_sql(anyarray) RETURNS SETOF
> anyelement AS
> $_$
> SELECT ($1)[i] FROM
> generate_series(array_lower($1,1),array_upper($1,1)) i;
> $_$
>    LANGUAGE sql IMMUTABLE;
>
> create or replace function unnest_plpgsql(_a anyarray) returns setof
> anyelement as $$
> begin
>     for i in array_lower(_a,1) .. array_upper(_a,1) loop
>         return next _a[i];
>     end loop;
>     return;
> end;
> $$ language plpgsql strict immutable;


В списке pgsql-general по дате отправления:

Предыдущее
От: Douglas Alan
Дата:
Сообщение: Re: What is the right way to deal with a table with rows that are not in a random order?
Следующее
От: "Bayless Kirtley"
Дата:
Сообщение: Re: Daylight saving time question