Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как читать из таблицы в массив порциями ? / 13 сообщений из 13, страница 1 из 1
13.01.2016, 15:32
    #39146531
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
Как читать из таблицы в массив порциями ?
...
Рейтинг: 0 / 0
13.01.2016, 15:37
    #39146536
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
Бока,
а почему вы спрашиваете ?
...
Рейтинг: 0 / 0
13.01.2016, 16:01
    #39146573
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwq,

Я делаю вот что :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH w_text_uuid AS
(SELECT c_id FROM crm00 WHERE SUBSTR(c_id,1,3) <> '@t#'
 UNION
 SELECT c_id FROM crm11 WHERE SUBSTR(c_id,1,3) <> '@t#'
 UNION 
 SELECT c_id FROM crm22 WHERE SUBSTR(c_id,1,3) <> '@t#')
SELECT c_id,uuid_generate_v4() c_uuid FROM w_text_uuid;

UPDATE public.crm00 c0 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c0.c_id = ct.c_id;

UPDATE public.crm11 c1 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c1.c_id = ct.c_id;

UPDATE public.crm22 c2 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c2.c_id = ct.c_id;


Это оформлено в функцию . Один мой сотрудник запускал эту функцию на миллионных и десятки-миллионных количествах входных записей и говорит , что процесс взял очень много темповой памяти (видимо для UPDATE...FROM) и его пришлось снять.
Поэтому я подумал, что надо обрабатывать порциями.
...
Рейтинг: 0 / 0
13.01.2016, 16:04
    #39146577
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwq,

Перед WITH...
вот что...
Код: plsql
1.
CREATE TABLE crm_table AS 


т.е.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE crm_table AS 
WITH w_text_uuid AS
(SELECT c_id FROM crm00 WHERE SUBSTR(c_id,1,3) <> '@t#'
 UNION
 SELECT c_id FROM crm11 WHERE SUBSTR(c_id,1,3) <> '@t#'
 UNION 
 SELECT c_id FROM crm22 WHERE SUBSTR(c_id,1,3) <> '@t#')
SELECT c_id,uuid_generate_v4() c_uuid FROM w_text_uuid;

UPDATE public.crm00 c0 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c0.c_id = ct.c_id;

UPDATE public.crm11 c1 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c1.c_id = ct.c_id;

UPDATE public.crm22 c2 SET c_id = '@t#'||ct.c_uuid
 FROM crm_table ct
 WHERE c2.c_id = ct.c_id;
...
Рейтинг: 0 / 0
13.01.2016, 16:20
    #39146600
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
БокаПоэтому я подумал, что надо обрабатывать порциями.
"обрабатывать порциями"
и "читать в массив" -- немного разные задачи. даже ортогональные.


Я бы вместо темп таблицы бежал вдоль
Код: sql
1.
2.
3.
4.
FOR _rec IN (ваш селект для темповой)
LOOP
    -- DO something autonomously
END;



возможно, правда, не делая нечто автономно для каждой записи, а копя по 100-500 "DO" в батчи. и по накоплении 100-500 -- отправляя на исполнение.

делать что--то автономно я приучен через дблинк[CREATE EXTENSION dblink; ]. Но с недавнего времени попробовал бы это же в postgres_fdw -- ещё не проверял в количествах.
dblink же хорош для такой задачи, поскольку можно воспользоваться prepare -- execute--ами.
...
Рейтинг: 0 / 0
13.01.2016, 16:22
    #39146602
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
вдогон: для большой задачи напрашивается журнал, и возможность рестарта "от достигнутого"
...
Рейтинг: 0 / 0
13.01.2016, 16:59
    #39146647
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwq,

А в каждой операции цикла делать UPDATE одной записи ? Я предполагаю, что это большое время займет. Разве автономное выполнение может ускорить этот процесс ? Я думаю, что и бэтчи тоже не сильно убыстрят процесс.

Поэтому я решил брать результат моего запроса WITH... в массив порциями, а этот массив использовать в UPDATE...FROM как "ct" вместо "crm_table". Можно ли такое реализовать в Postgres ?
...
Рейтинг: 0 / 0
13.01.2016, 17:09
    #39146654
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
Бока,
хотел ответить по существу, что, как , почему, но это долго

т.ч. по вашему вопросу

что вам мешает делать это вдоль цЫкла:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
....
FOR _rec IN (ваш селект для темповой)
LOOP
   _i:=I+1;    
   _arr:=arr||(_rec::any_type);

   IF i % 1000 =0 THEN
        DO SOMETHING with _arr;
        _i:=0;
        _arr:= ARRAY[]::any_type[];
   END IF;
END;

    IF i % <> 0 THEN
        DO SOMETHING with _arr;
        _i:=0;
        _arr:= ARRAY[]::any_type[];
   END IF;
...
Рейтинг: 0 / 0
13.01.2016, 18:33
    #39146722
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwqБока,
хотел ответить по существу, что, как , почему, но это долго

т.ч. по вашему вопросу

что вам мешает делать это вдоль цЫкла:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
....
FOR _rec IN (ваш селект для темповой)
LOOP
   _i:=I+1;    
   _arr:=arr||(_rec::any_type);

   IF i % 1000 =0 THEN
        DO SOMETHING with _arr;
        _i:=0;
        _arr:= ARRAY[]::any_type[];
   END IF;
END;

    IF i % <> 0 THEN
        DO SOMETHING with _arr;
        _i:=0;
        _arr:= ARRAY[]::any_type[];
   END IF;

qwwq,

1.) Обьясните пожалуйста , что такое "_arr" и "arr" и как их декларировать ?

2.) Как это оформить для автономного выполнения ?
...
Рейтинг: 0 / 0
13.01.2016, 18:47
    #39146727
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
Бока1.) Обьясните пожалуйста , что такое "_arr" и "arr" и как их декларировать ?

2.) Как это оформить для автономного выполнения ?
arr -- это опечатка. там инкерментирование _arr конкатенацией.

У вас должен быть где--то объявлен требуемый вам тип вашего компаунда , с именем any_type. [при этом поц-гресс сам создаст массивный тип, обычно с именем "_any_type", о чём можно не задумываццо]
а дальше -- всё кака бычна:

Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE
   _arr any_type[];
   _rec any_type; -- можно прямо тут, чтобы не кастить на проходе
   _i integer;
BEGIN
   ......
 
...
Рейтинг: 0 / 0
13.01.2016, 19:06
    #39146739
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwq,

а знак "%" тут какую роль играет?
...
Рейтинг: 0 / 0
13.01.2016, 20:41
    #39146780
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
Бокаqwwq,

а знак "%" тут какую роль играет?
-- написано от балды

в первом случае -- сравнение по модулю
можно заменить простым >=
во втором -- остаток от копипасты, недовычещенный

-- это нарезание на массивы длиной 1000; в конце-- обработка хвостика
...
Рейтинг: 0 / 0
13.01.2016, 22:47
    #39146828
Бока
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как читать из таблицы в массив порциями ?
qwwq,

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


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