Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / даст ли ХП ускорение инсертов? / 12 сообщений из 12, страница 1 из 1
20.05.2005, 14:09
    #33077116
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
клиент на PHP.
будет ли вставка выполняться быстрее, если выполнять ее не как несколько отдельно идущих инсертов, а через ХП? т.е. передать в ХП все эти инсерты массивом и ХП обойдет этот массив и сделает вставки.
слышал что ХП вроде компилируются при создании и поэтому работают быстрее.

попутно - что быстрее будет 1 инсерт или тот же инсерт, но через ХП?
...
Рейтинг: 0 / 0
20.05.2005, 14:17
    #33077151
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
P.S. база на localhost
...
Рейтинг: 0 / 0
20.05.2005, 14:25
    #33077179
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
Код: plaintext
передать в ХП все эти инсерты массивом

вот тут поподробнее что значит передать массивом?

Код: plaintext
ХП вроде компилируются при создании и поэтому работают быстрее

компилируются только при создании сессии и живут в кэше до ее окончания
ПХП скриптовый язык сессия будет каждый раз новая открываться и закрываться. да и если еще и запросы туда передавать массивом??? (стрингами что-ли) то тогда скорее всего придется использовать EXECUTE, а это выполнение запроса с нуля

ИМХО
быстрее не будет
...
Рейтинг: 0 / 0
20.05.2005, 15:21
    #33077416
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE table
(
  id serial NOT NULL,
  num int4 NOT NULL
) 
WITHOUT OIDS;

PHP:
Вариант 1:
Код: plaintext
1.
for ($i= 0 ; $i< 100 ; $i++) { pg_query("INSERT INTO table (num) VALUES ($i)"); }

Вариант 2:
Код: plaintext
1.
2.
for ($i= 0 ; $i< 100 ; $i++) { $num[$i] = $i; }
pg_query("SELECT store_num($num)");

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION store_num(int4[])
  RETURNS int4 AS
$BODY$
    DECLARE i int4;
    BEGIN
        FOR i in  1 .. 100  LOOP
            INSERT INTO table (num) VALUES ($ 1 [i])
        END LOOP;
        RETURN  0 ;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
20.05.2005, 16:01
    #33077566
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
ну если так ПХП умеет таким образом передавать массивы то 2 вариант должен быть быстрее.

я незнаю как устроен драйвер для ПХП ... да хотя в любом случае быстрее будет

проблема может быть в размере массива который передается в базу думаю это тонкий момент ...

вообщем есть простой способ проверить вставь 500 000 записей так и так и посмотри на результат и результат сообщи :-))
...
Рейтинг: 0 / 0
20.05.2005, 16:50
    #33077737
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
мдя. ПХП оказалось так не умеет так что пришлось несколько изменить вариант 2 и передавать массив строкой.

Код: plaintext
1.
2.
3.
$num = "{";
for ($i= 0 ; $i< 50000 ; $i++) { $num .= $i; if ($i!= 49999 ) { $num .= ","; } }
$num .="}";

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

Результаты:
Вариант 1 - 50 000 инсертов один за другим
Вариант 2 - 50 000 элементов передаются в ХП, которая в цикле делает инсерты

server bill # time ./1.php
real 2m19.252s
user 0m9.620s
sys 0m3.208s

server bill # time ./2.php
real 0m18.414s
user 0m0.826s
sys 0m0.070s

server bill # time ./1.php
real 2m48.706s
user 0m9.565s
sys 0m3.197s

server bill # time ./2.php
real 0m18.564s
user 0m0.818s
sys 0m0.100s


Называется сам спросил - сам ответил. Ушел переделывать на 2ой вариант =))

P.S. как в plpg посчитать размер массива?
...
Рейтинг: 0 / 0
20.05.2005, 17:31
    #33077838
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
идея хорошая только надо правильно стринги создавать (кавычки слэшить и все такое прочее)

array_upper (anyarray, integer) второй параметр вложение массива
...
Рейтинг: 0 / 0
20.05.2005, 21:10
    #33078135
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
А что если еще попытаться ускорить?
Вариант 3:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION store_num(int4[])
  RETURNS int4 AS
$BODY$
    DECLARE i int4;
    BEGIN
        PREPARE fooplan (int) AS INSERT INTO table (num) VALUES($ 1 );
        FOR i in  1 .. 100  LOOP
            EXECUTE fooplan($ 1 [i]);
        END LOOP;
        RETURN  0 ;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

или PREPARE в ХП ускорения все-равно не даст?
...
Рейтинг: 0 / 0
21.05.2005, 11:54
    #33078404
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
Протестируй ещё вариант 1а:
Код: plaintext
1.
2.
3.
pg_query('BEGIN');
for ($i= 0 ; $i< 100 ; $i++) { pg_query("INSERT INTO table (num) VALUES ($i)"); }
pg_query('COMMIT');
...
Рейтинг: 0 / 0
21.05.2005, 13:25
    #33078458
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE tbl
(
  id serial NOT NULL,
  num int4
)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION store_num(_int4)
  RETURNS int4 AS
$BODY$
    DECLARE i int4;
    BEGIN
        FOR i in  1 .. 50000  LOOP
            INSERT INTO tbl (num) VALUES ($ 1 [i]);
        END LOOP;
        RETURN  0 ;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Еще раз:

Вар.1:
Код: plaintext
1.
for ($i= 0 ; $i< 50000 ; $i++) { pg_query("INSERT INTO tbl (num) VALUES ($i)"); }

Вар.1а:
Код: plaintext
1.
2.
3.
pg_query("BEGIN");
for ($i= 0 ; $i< 50000 ; $i++) { pg_query("INSERT INTO tbl (num) VALUES ($i)"); }
pg_query("COMMIT");

Вар.2:
Код: plaintext
1.
2.
3.
4.
$num = "{";
for ($i= 0 ; $i< 50000 ; $i++) { $num .= $i; if ($i!= 49999 ) { $num .= ","; } }
$num .="}";
pg_query("SELECT store_num('$num')");

server bill # time ./1.php
real 2m4.317s
user 0m9.127s
sys 0m2.924s

server bill # time ./1a.php
real 0m59.718s
user 0m10.055s
sys 0m3.445s

server bill # time ./2.php
real 0m18.676s
user 0m0.796s
sys 0m0.093s


server bill # time ./1.php
real 2m22.546s
user 0m8.854s
sys 0m2.987s

server bill # time ./1a.php
real 0m59.365s
user 0m10.104s
sys 0m3.481s

server bill # time ./2.php
real 0m17.505s
user 0m0.808s
sys 0m0.090s

А вот с вар.3 не соображу как PREPARE в ХП всунуть... =(
...
Рейтинг: 0 / 0
22.05.2005, 15:27
    #33079018
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
prepare в plpgsql делать нельзя только из sql

да и что за спешность такая? зачем тебе скорость? насколько она критична? и вариант 1а тоже ничего зато все всегда будет работать
...
Рейтинг: 0 / 0
22.05.2005, 16:35
    #33079054
Drew0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
даст ли ХП ускорение инсертов?
да в принципе спешки нет никакой, но если можно на вставку данных вместо 2 минут потратить 18 секунд, то почему нет? =)

насчет вар. 1а - у меня все-равно на этой таблице триггер на вставку стоял. так что ХП задачу не усложнила в моем случае.

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


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