powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какой язык PG быстрее
8 сообщений из 8, страница 1 из 1
Какой язык PG быстрее
    #35536423
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG предлагает языки программирования от C до Python. При этом есть и как бы встроенный, "родной" язык pg pl/sql. Казалось бы сохраненные процедуры написанные на C должны работать быстрее. Но что то мне подсказывает что родной язык и есть самый быстрый из-за отсутсвия "швов". Что правда.
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35537381
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то каждый язык в своем случае имеет свою производительность в зависимости от поставленой задачи.
Сложно сравнить призводительность plpgsql и например plperlu.
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35538084
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Степан H.Вообще-то каждый язык в своем случае имеет свою производительность в зависимости от поставленой задачи.
Сложно сравнить призводительность plpgsql и например plperlu.

А если сравнивать С с plpgsql ?
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35543605
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри сюда:

pllua

pllua-classic

Второй биндинг - моя поделка. Вроде работает, но собирать нужно более-менее вручную. Если понравится буду рад поддерживать его.
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35638881
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_FalconВторой биндинг - моя поделка. Вроде работает, но собирать нужно более-менее вручную. Если понравится буду рад поддерживать его. а можно подробнее - что это и зачем?
по ссылке ничего толком не написано, ключевая фраза "It allows using records, arrays, arrays of records as correspondingly nested lua hashes"?
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35697860
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddie
ключевая фраза "It allows using records, arrays, arrays of records as correspondingly nested lua hashes"


В lua есть один тип контейнера: таблица - он же хеш.
Ближайший к нему сородич - array в PHP.
Отличия:
1.- в array/PHP ключи могут быть только строками (числа в ключах работают как строки )
- таблица Lua различает числа, строки, позволяет любым данным быть ключами (правда, таблицы и userdata ищутся только как identity )
2. - array/PHP - всегда упорядоченная структура - значения выбираются в том порядке в котором они туда попадали ( или в каком они после сортировки )
( для примера сделайте $a = array( 3=>'3', 2=>'2', 1=>'1'); foreach( $a as $val ){ echo $val,' '; } )
- в Lua таблице упорядочена только часть считающаяся массивом ( номера с 1..n где n - номер элемента != nil, следующий за которым nil )
В целом, поэтому таблица Lua - намного более легковесная и шустрая ( хотя array/PHP иногда мне напоминает швейцарский армейский ножик :-) )
3. так как таблица - единственный встроенный тип данных, конструкция её и обращение к её полям упрощено, т.е.
В PHP:
$a = array( 'id'=>1, 'name'=>'jo', 'value'=>'black' );
$a['name'] = 'jojo';
echo $a['id'], $a['name'], $a['value'];
В Lua может быть так:
local a = {['id']=1, ['name']='jo', 'value'='black'}
a['name']='jojo'
print( a['id'], a['name'], a['value'] )
или полностью эквивалентно, но гораздо приятнее:
local a = { id=1, name='jo', value='black' }
a.name = 'jojo'
print( a.id, a.name, a.value )
Вот почему, в принципе, мне нравится Lua ( если опустить наибольшую скорость среди скриптовых языков )

Перейдем к: "It allows using records, arrays, arrays of records as correspondingly nested lua hashes"
plpythonu позволяет нам получать записи из запроса в виде хэша (dict в Python). Однако все данные он приводит либо к числу, либо к строке. Если одно из полей результат массив или запись ( благо Postgresql нам это позволяет ), то разбирать нам придётся её самим.
plperl опознаёт с массивами целых чисел ( правда получает он его разбором строки )
дальше всего идёт plruby, но ruby - достаточно медленный язык сам по себе ( это не мешает мне его обажать :-) , но как язык внутри PostgreSQL я его буду использовать в предпосленюю очередь.

в pllua-classic все попадающиеся массивы, записи, массивы записей, записи, содержащие массивы - правильно переводятся в таблицы и таблицы таблиц
К примеру:
допустим есть таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table warriors (
  id serial primary key,
  name varchar,
  weapons varchar[]
);
insert into warriors ( name, weapons )
values
  ( 'peter', array['knife', 'sword'] ),
  ( 'george', array['gun', 'machine gun']);

select warriors as warrior from warriors;
              warrior
------------------------------------
 ( 1 ,peter,"{knife,sword}")
 ( 2 ,george,"{gun,""machine gun""}")
( 2  rows)
сделав тот же запрос в plpython мы получим еквивалент
res = [{'warrior':'(1,peter,"{knife,sword}")'},{'warrior':'(2,george,"{gun,""machine gun""}")'}]
т.е. значением res[0]['warrior'] будет строка '(1,peter,"{knife,sword}")'

сделав же его в pllua_classic мы получим результат, эквивалентный (не полностью, но достаточно )
res = { {warrior = {id=1, name='peter', weapons={'knife','sword'} } }, { warror= {id=2, name='peter', weapons={'gun', 'machine gun'} } } }
т.е. res[1].warrior.weapons будет таблица {'knife', 'sword' } (примечание: в Lua таблица аля массив нумеруется с 1!!!)


Выдержки из папки sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
drop type id_sum cascade;
create type id_sum as (
  ids int4[],
  sums float8[]
);

drop type two_arrays cascade;
create type two_arrays as (
  one int4[],
  two int4[]
);

drop table if exists test_lua cascade;
create table test_lua (
  id serial primary key,
  name varchar,
  names varchar[],
  ints int4[],
  sums id_sum[]
);

insert into test_lua (name, names, ints, sums)
values 
  ('hi1', '{ho1_1, ho1_2}', '{1,2,3,4,5}', E'{"(\\"{2,3}\\",\\"{4,5}\\")"}'),
  ('hi2', '{ho2_1, ho2_2}', ARRAY[ 2 , 3 , 4 , 5 , 6 ], ARRAY[ROW(ARRAY[ 2 , 3 ], ARRAY[ 4 . 0 ,  5 . 0 ])::id_sum]);

create or replace function test_recordset_lua1()
returns setof id_sum
language plluacu
as $$
  local i =  1 
  coroutine.yield({ids = {i+ 1 , i+ 2 }, sums={i+  0 . 4 , i+ 0 . 6 } })
  i = i +  1 
  spi.return_next({ids = {i+ 1 , i+ 2 }, sums={i+  0 . 4 , i+ 0 . 6 } })
  i = i +  1 
  return ipairs{
    {ids = {i+ 1 , i+ 2 }, sums={i+  0 . 4 , i+ 0 . 6 } },
    {ids = {i+ 6 , i+ 6 }, sums={i+  0 . 5 , i+ 0 . 7 } }
    }
$$; 

select t.ids, t.sums from test_recordset_lua1() as t;
  ids  |   sums    
-------+-----------
 { 2 , 3 } | { 1 . 4 , 1 . 6 }
 { 3 , 4 } | { 2 . 4 , 2 . 6 }
 { 4 , 5 } | { 3 . 4 , 3 . 6 }
 { 9 , 9 } | { 3 . 5 , 3 . 7 }
( 4  rows)

create or replace function test_recordset_lua2()
returns setof id_sum
language plluacu
as $$--[==[prepare
  local insert = table.insert
  local function add_arr(ar, i)
      insert(ar, {ids = {i+ 1 , i+ 2 }, sums={i+  0 . 4 , i+ 0 . 6 } })
  end
--]==]
  local i =  1 
  local ar = {}
  add_arr(ar, i)
  i = i +  1 
  add_arr(ar, i)
  spi.return_next( ipairs(ar) )
  spi.return_next( set(ar) )
  ar = {}
  i = i +  1 
  add_arr(ar, i)
  i = i +  1 
  add_arr(ar, i)
  return set(ar)
$$; 

select t.ids, t.sums from test_recordset_lua2() as t;
CREATE FUNCTION
  ids  |   sums    
-------+-----------
 { 2 , 3 } | { 1 . 4 , 1 . 6 }
 { 3 , 4 } | { 2 . 4 , 2 . 6 }
 { 2 , 3 } | { 1 . 4 , 1 . 6 }
 { 3 , 4 } | { 2 . 4 , 2 . 6 }
 { 4 , 5 } | { 3 . 4 , 3 . 6 }
 { 5 , 6 } | { 4 . 4 , 4 . 6 }
( 6  rows)

create or replace function test_spi_lua2()
returns setof varchar
language plluacu
as $$--[==[prepare
local yield = coroutine.yield
--]==]
  local ret = spi.execute('select * from test_lua')
  yield( #ret )
  for i, row in ipairs(ret) do
    yield("--- by position --")
    for k,v in ipairs(row) do
      yield( ("%s: %s"):format(k, tostring(v)))
    end
    yield("--- by name --")
    for k,v in spi.tuple_by_name(row) do
      yield( ("%s: %s"):format(k, tostring(v)))
    end
  end
$$;

select * from test_spi_lua2();
      test_spi_lua2      
-------------------------
  2 
 --- by position --
  1 :  2 
  2 : hi2
  3 : table: 0x845b2a8
  4 : table: 0x845b130
  5 : table: 0x845b198
 --- by name --
 name: hi2
 id:  2 
 sums: table: 0x845b198
 ints: table: 0x845b130
 names: table: 0x845b2a8
 --- by position --
  1 :  1 
  2 : hi1
  3 : table: 0x848f6e8
  4 : table: 0x848f770
  5 : table: 0x848f7d8
 --- by name --
 name: hi1
 id:  1 
 sums: table: 0x848f7d8
 ints: table: 0x848f770
 names: table: 0x848f6e8
( 25  rows)

create or replace function test_spi_lua3(i int)
returns setof test_lua
language plluacu
as $$
  local ret = spi.query('select test_lua.* from test_lua')
  return ret
$$;

select * from test_spi_lua3( 1 );
CREATE FUNCTION
 id | name |     names     |    ints     |         sums          
----+------+---------------+-------------+-----------------------
   2  | hi2  | {ho2_1,ho2_2} | { 2 , 3 , 4 , 5 , 6 } | ("{1,2}","{3.4,5.6}")
   1  | hi1  | {ho1_1,ho1_2} | { 1 , 2 , 3 , 4 , 5 } | ("{2,3}","{4.5,5.6}")
( 2  rows)

...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35702069
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_Falcon,

так всё-таки в чём разница с pllua? :)
...
Рейтинг: 0 / 0
Какой язык PG быстрее
    #35713655
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ... Я начал pllua-classic больше из-за внутренних разногласий:
1) в pllua при выборке ты получаешь не таблицу таблиц LUA, а user-data tupletable из которого ты можешь выбирать userdata tuple. Эти userdata являются обёртками вокруг соответствующих структур данных Postgres: tupltable и tuple.
Не спорю, может быть это реальная экономия памяти ( а может и нет ), но мне кажется, раз уж мы выбрали Lua, то и работать логичнее с данными, родными для Lua.
2) в pllua 0.1 не возможно было перебрать все поля tuple в цикле - ты должен был знать, какие у тебя поля.
3) в pllua 0.1 были внутреннее разногласие с документацией LUA. Честно, не знаю как сейчас.
Кроме того, схема хранения информации о временном типе ( при выборке данных ) была потенциально неверной. Может быть сейчас это исправленно.

Кроме того у меня: реализованы подтранзакции, разный режим выбора данных ( с преобразованием в таблицы, или только в строку), быстрые функции для работы с timestamp и timestamptz... что-то еще, что я уже не помню :-( .
К сожалению, я ушел с работы, где требовался PostgreSQL ;-( . Но если кому-то pllua-classic будет интересен, готов править баги :-)
Кроме того - реальная версия его где-то pllua-classic-0.0.4 (под такой версией я его заливал на SourceForge) и, по-крайней мере на моей машине, он не содержит багов, и не сваливает сервер в рестарт. Опять таки - пожалуйста, тестируйте его, пробуйте применять на реальных задачах, я с удовольствием буду исправлять баги .
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какой язык PG быстрее
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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